Какие аргументы получает функция middleware в Django

Ответ

В Django функция middleware получает один аргумент — get_response.

get_response — это вызываемый объект (callable), который представляет собой следующий слой middleware в цепочке или, если это последний слой, саму view-функцию. Middleware должно вернуть внутреннюю функцию middleware(request), которая и будет вызываться для обработки запроса.

Структура Django Middleware

Современный middleware в Django реализуется как фабрика — функция, которая возвращает другую функцию.

  1. Внешняя функция (simple_middleware): Вызывается один раз при старте сервера. Её задача — выполнить первоначальную настройку и вернуть middleware.
  2. Внутренняя функция (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).