Какова роль и принцип работы Middleware в Django?

Ответ

Middleware в Django — это система "хуков" (hooks) в цикл обработки запроса-ответа. Она позволяет выполнять код на разных этапах: до того, как запрос достигнет view-функции, и после того, как view-функция сгенерирует ответ.

Основная задача Middleware — глобальная обработка объектов запроса (request) и ответа (response).

Принцип работы

Middleware образуют цепочку, через которую последовательно проходит запрос. Порядок определяется списком MIDDLEWARE в файле settings.py.

  1. Обработка запроса: request проходит через каждый middleware сверху вниз, от первого к последнему в списке MIDDLEWARE.
  2. Обработка View: Django вызывает соответствующую view-функцию.
  3. Обработка ответа: response проходит через middleware в обратном порядке, снизу вверх.

Это позволяет каждому компоненту middleware видеть и изменять request на пути к view и response на пути к клиенту.

Пример современного Middleware (class-based)

# myapp/middleware.py
class SimpleLoggingMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # Одноразовая конфигурация и инициализация.

    def __call__(self, request):
        # Код, который выполняется для каждого запроса
        # перед вызовом view (и последующих middleware).
        print(f"Request path: {request.path}")

        response = self.get_response(request)

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

Основные сценарии использования:

  • Аутентификация и авторизация (AuthenticationMiddleware).
  • Управление сессиями (SessionMiddleware).
  • Защита от CSRF-атак (CsrfViewMiddleware).
  • Логирование запросов и ответов.
  • Сжатие контента (Gzip).
  • Добавление кастомных заголовков к ответу.