Что такое middleware в FastAPI и для чего оно используется

Ответ

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) — это вызов следующего звена в цепочке обработки. Все, что находится до этого вызова, выполняется на пути "внутрь" приложения, а все, что после, — на пути "наружу".