Ответ
В Django функция middleware получает один аргумент — get_response
.
get_response
— это вызываемый объект (callable), который представляет собой следующий слой middleware в цепочке или, если это последний слой, саму view-функцию. Middleware должно вернуть внутреннюю функцию middleware(request)
, которая и будет вызываться для обработки запроса.
Структура Django Middleware
Современный middleware в Django реализуется как фабрика — функция, которая возвращает другую функцию.
- Внешняя функция (
simple_middleware
): Вызывается один раз при старте сервера. Её задача — выполнить первоначальную настройку и вернутьmiddleware
. - Внутренняя функция (
middleware
): Вызывается для каждого запроса. Она принимает объектrequest
.
Пример:
# myapp/middleware.py
def simple_middleware(get_response):
# Код здесь выполняется один раз при инициализации
print("Middleware initialized")
def middleware(request):
# Код здесь выполняется перед вызовом view
print(f"Processing request: {request.path}")
# Передача управления следующему middleware или view
response = get_response(request)
# Код здесь выполняется после того, как view отработала
response['X-Custom-Header'] = 'Processed by middleware'
print("Processing response")
return response
return middleware
Ключевые моменты:
request
: ОбъектHttpRequest
, который можно модифицировать до передачи в view.response
: ОбъектHttpResponse
, полученный от view, который можно изменить перед отправкой клиенту.- Порядок: Код до
get_response(request)
выполняется "на пути внутрь" (request phase), а код после — "на пути наружу" (response phase).