Что такое Middleware и как его реализовать в Django и FastAPI

«Что такое Middleware и как его реализовать в Django и FastAPI» — вопрос из категории Django, который задают на 22% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Middleware — это промежуточный слой обработки, который находится между веб-сервером и представлением (view). Он позволяет выполнять сквозную логику для каждого запроса или ответа, не дублируя код в каждом обработчике.

Основные задачи Middleware:

  • Аутентификация и авторизация: Проверка прав доступа пользователя.
  • Логирование: Запись информации о запросах и ответах.
  • Обработка сессий: Управление данными сессии.
  • Добавление заголовков: Например, CORS или Content-Security-Policy.
  • Сжатие ответов: Например, с помощью Gzip.

Реализация в FastAPI

В FastAPI Middleware реализуется с помощью декоратора @app.middleware("http") для асинхронных функций.

from fastapi import FastAPI, Request
import time

app = FastAPI()

@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    # Добавляем кастомный заголовок со временем обработки
    response.headers["X-Process-Time"] = str(process_time)
    return response

Реализация в Django

В Django Middleware обычно реализуется как класс с методами __init__ и __call__.

# myapp/middleware.py
class SimpleLoggingMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Код, который выполняется перед обработкой view
        print(f"Processing request: {request.path}")

        response = self.get_response(request)

        # Код, который выполняется после обработки view
        print(f"Response status code: {response.status_code}")
        return response

# settings.py
MIDDLEWARE = [
    # ...
    'myapp.middleware.SimpleLoggingMiddleware',
    # ...
]