Короткий ответ
Middleware — это слой кода, который выполняется для каждого (или группы) HTTP-запроса до и/или после основного обработчика; его используют для сквозной функциональности — логирования, аутентификации, CORS, обработки ошибок, замера времени запроса.
Как это работает подробнее
запрос проходит цепочку middleware по порядку их регистрации перед тем, как попасть в обработчик маршрута, а ответ проходит ту же цепочку в обратном порядке — так middleware может модифицировать и запрос, и ответ.
Пример кода
example.py
import time
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start = time.perf_counter()
response = await call_next(request)
duration = time.perf_counter() - start
response.headers["X-Process-Time"] = str(duration)
return responseЧто использовать на практике
- Рекомендация. middleware удобно для логики, общей для всех (или многих) эндпоинтов — не нужно дублировать код проверки токена или логирования в каждом обработчике отдельно. Но не всякая сквозная логика должна быть middleware — если проверка специфична для конкретного эндпоинта (например, доступ к конкретному ресурсу), лучше использовать dependency/декоратор на уровне обработчика.
Подводные камни
- Риски. помещать в middleware тяжёлую бизнес-логику, которая должна зависеть от параметров конкретного запроса/маршрута, что усложняет тестирование и переиспользование; забывать обрабатывать исключения внутри middleware, из-за чего ошибка в middleware "роняет" обработку запроса до того, как сработает глобальный обработчик ошибок.