FastAPI - не может получить доступ к параметрам пути из промежуточного программного обеспечения - PullRequest
1 голос
/ 14 июля 2020

Мой типичный путь примерно такой:

/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.

1 Ответ

1 голос
/ 15 июля 2020

Вы не сможете достичь своей цели с помощью промежуточного программного обеспечения, потому что промежуточное программное обеспечение выполняется до маршрутизации.

Поэтому FastAPI / Starlette не знает, с каким путем он будет соответствовать, и не может заполнить path_params .

Вам нужно будет использовать другое решение, например, передать эти параметры в cook ie, заголовке или аргументе запроса или с помощью декоратора / Dependency.

Ссылка:

https://github.com/encode/starlette/issues/230

https://fastapi.tiangolo.com/tutorial/middleware/#middleware

...