Какие ключевые методы необходимо реализовать для создания middleware в Python?

Ответ

Для создания middleware в Python, как правило, реализуется класс с обязательными методами __init__ и __call__. Конкретная сигнатура этих методов зависит от спецификации, которой следует фреймворк (например, ASGI или WSGI).

Основной принцип middleware — это "обертка" над следующим обработчиком запроса, позволяющая выполнить код до и после его отработки.

Пример для Django (на основе WSGI)

В Django middleware инициализируется один раз и затем вызывается для каждого запроса.

class SimpleMiddleware:
    def __init__(self, get_response):
        # get_response — это следующий middleware в цепочке или само view
        self.get_response = get_response

    def __call__(self, request):
        # Код, который выполняется до вызова view
        print("Before request")

        response = self.get_response(request)

        # Код, который выполняется после вызова view
        print("After request")
        return response

Пример для FastAPI/Starlette (на основе ASGI)

ASGI-middleware работает с асинхронными вызовами и оперирует более низкоуровневыми объектами scope, receive, send.

from starlette.types import ASGIApp, Scope, Receive, Send

class CustomMiddleware:
    def __init__(self, app: ASGIApp):
        self.app = app

    async def __call__(self, scope: Scope, receive: Receive, send: Send):
        # Код до обработки запроса
        if scope["type"] == "http":
            # Можно модифицировать scope или заголовки
            pass

        await self.app(scope, receive, send)

        # Код после обработки запроса (сложнее, т.к. ответ уже может быть отправлен)

Ключевые методы и их роли:

  • __init__(self, get_response / app): Конструктор. Вызывается один раз при запуске сервера для настройки middleware. Принимает следующий обработчик в цепочке.
  • __call__(self, request / scope, receive, send): Основной метод. Вызывается для каждого запроса. Именно здесь реализуется логика обработки.