Как применить middleware к конкретному пути (роуту) в FastAPI?

Как применить middleware к определенному роуту в FastAPI?

У меня есть код для применения middleware к определенному роуту в Starlette, но не знаю, как его использовать в FastAPI:

```python
from fastapi import FastAPI
from starlette.middleware import Middleware
from starlette.middleware.gzip import GZipMiddleware
from starlette.routing import Mount, Route

routes = [
    Mount(
        "/",
        routes=[
            Route(
                "/example",
                endpoint=...,
            )
        ],
        middleware=[Middleware(GZipMiddleware)]
    )
]

app = FastAPI()
app.mount("/", app=Starlette(routes=routes))
```

Как я могу использовать middleware в FastAPI для определенного роута?
  • 13 февраля 2024 г. 19:18
Ответы на вопрос 1
В FastAPI вы можете применить middleware к конкретному пути (роуту), используя функцию `add_middleware` и передавая ей объект FastAPI приложения и middleware.

Вот пример:

```python
from fastapi import FastAPI
from starlette.middleware import Middleware
from starlette.middleware.gzip import GZipMiddleware

app = FastAPI()

@app.get("/example", summary="Пример роута")
async def example_route():
    return {"message": "Пример"}

middleware = [
    Middleware(GZipMiddleware)
]

app.add_middleware(GZipMiddleware, exclude_path="/example")
app.add_middleware(GZipMiddleware, include_path="/example")

app.add_middleware(
    GZipMiddleware,
    include_path="/example",
    exclude_path="/example/subpath"
)
```

Здесь мы оборачиваем FastAPI приложение (объект `app`) middleware с помощью `add_middleware`. Для применения middleware к конкретному роуту вы можете использовать аргументы `include_path` и `exclude_path`. В приведенном примере мы добавляем middleware GZipMiddleware для всех роутов, исключая путь "/example", и применяем middleware к пути "/example". Вы также можете использовать `add_middleware` несколько раз, чтобы применить middleware к различным путям.

Обратите внимание, что `add_middleware` добавляет middleware в цепочку middleware для всех обработчиков запросов. Если вы хотите применить middleware только к конкретному роуту, вы должны установить `exclude_path` для остальных роутов, чтобы они не применяли middleware.
Похожие вопросы