Ответ
Для создания 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): Основной метод. Вызывается для каждого запроса. Именно здесь реализуется логика обработки.