PRO

Как реализовать middleware в FastAPI?

Middleware в FastAPI обрабатывает каждый HTTP-запрос до endpoint и каждый HTTP-ответ после endpoint. Его используют для логирования, измерения времени ответа, заголовков безопасности, корреляционных идентификаторов и других сквозных задач.
Подробный ответ

Что такое 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 response

Class-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 должен быть лёгким, потому что выполняется почти на каждом запросе.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге