Ответ
Middleware (промежуточное ПО) в FastAPI — это функция, которая обрабатывает каждый входящий запрос перед тем, как он достигнет обработчика пути, и каждый исходящий ответ перед его отправкой клиенту.
Оно используется для сквозной функциональности, применяемой ко многим или всем эндпоинтам. Основная польза — вынесение общей логики из обработчиков, что делает код чище и позволяет избежать дублирования.
Основные сценарии использования:
- Логирование: запись информации о каждом запросе и ответе.
- Аутентификация: проверка токенов или сессий.
- Обработка CORS: добавление необходимых заголовков.
- Измерение времени выполнения: отслеживание производительности запросов.
- Обработка ошибок: централизованный перехват исключений.
Пример middleware для логирования:
import time
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
# Код, который выполняется до обработки запроса
start_time = time.time()
# Передача запроса следующему middleware или обработчику пути
response = await call_next(request)
# Код, который выполняется после обработки запроса
process_time = time.time() - start_time
response.headers["X-Process-Time"] = str(process_time)
print(f"Запрос {request.method} {request.url.path} выполнен за {process_time:.4f} сек")
return response
@app.get("/")
async def root():
return {"message": "Hello World"}
В этом примере call_next(request) — это вызов следующего звена в цепочке обработки. Все, что находится до этого вызова, выполняется на пути "внутрь" приложения, а все, что после, — на пути "наружу".