Мой типичный путь примерно такой:
/user/{user_id}/resource/{resource_id}
У меня есть метод проверки, уже написанный в asyn c python, например:
async def is_allowed(user_id: int, resource_id: int) -> bool
Это возвращает boolean: true, если пользователь может получить доступ к ресурсу, иначе false.
Я хочу написать middleware
, который вызывает is_allowed
извлечение переменных из пути.
Я возился, но Я не могу найти, как их получить: я ожидал получить эту информацию от request.path_params
.
Как-то более полный пример (отредактированный после ответа @Marcelo Trylesinski):
import logging
from fastapi import FastAPI
from starlette.requests import Request
from starlette.responses import Response
app = FastAPI()
_logger = logging.getLogger()
_logger.setLevel(logging.DEBUG)
async def is_allowed(user_id, resource_id):
_logger.error(user_id)
_logger.error(resource_id)
return True
@app.middleware('http')
async def acl(request: Request, call_next):
user_id = request.path_params.get("user_id", None)
resource_id = request.path_params.get("resource_id", None)
allowed = await is_allowed(user_id, resource_id)
if not allowed:
return Response(status_code=403)
else:
return await call_next(request)
@app.get('/user/{user_id}/resource/{resource_id}')
async def my_handler(user_id: int, resource_id: int):
return {"what": f"Doing stuff with {user_id} on {resource_id}"}
Зарегистрированные значения: None
.