Как реализовать middleware в FastAPI?
Подробный ответ
Что такое middleware
Middleware — это слой между ASGI-сервером и endpoint. Он получает объект Request, может изменить или проверить запрос, вызвать следующий обработчик через call_next(), а затем обработать объект Response.
Пример middleware через декоратор
import time
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware('http')
async def add_process_time_header(request: Request, call_next):
started_at = time.perf_counter()
response = await call_next(request)
duration = time.perf_counter() - started_at
response.headers['X-Process-Time'] = str(duration)
return responseClass-based middleware
Для более сложных сценариев можно использовать middleware на основе BaseHTTPMiddleware или чистый ASGI middleware. Class-based вариант удобно подключать через app.add_middleware().
from starlette.middleware.base import BaseHTTPMiddleware
class RequestIdMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
response = await call_next(request)
response.headers['X-Service'] = 'api'
return response
app.add_middleware(RequestIdMiddleware)Для чего использовать
логирование запросов и времени выполнения;
создание request ID и distributed tracing;
безопасные HTTP-заголовки;
централизованные технические проверки;
настройка CORS, compression и trusted hosts через готовые middleware.
На что обратить внимание
Middleware выполняется для большого числа запросов, поэтому в нём нельзя делать тяжёлые операции и лишние запросы к базе. Также важно учитывать порядок middleware: он влияет на последовательность обработки запроса и ответа.
Как ответить на собеседовании
Middleware в FastAPI обрабатывает запрос до endpoint и ответ после него. Я использую его для сквозных технических задач, например логирования, метрик и request ID; middleware должен быть лёгким, потому что выполняется почти на каждом запросе.
Оцени свой прогресс