Что такое Middleware в Django и какие примеры можно привести?

Ответ

Middleware (промежуточное ПО) в Django — это система "хуков" в цикле обработки запроса/ответа. Это компоненты, которые обрабатывают запрос перед тем, как он достигнет view, и ответ после того, как он будет сгенерирован view. Их можно представить как слои луковицы, через которые проходит каждый запрос и ответ.

Основные встроенные Middleware

Django поставляется с набором стандартных Middleware, которые включены в проект по умолчанию:

  1. django.middleware.security.SecurityMiddleware Обеспечивает несколько важных улучшений безопасности: управляет заголовками X-Content-Type-Options, X-XSS-Protection, Strict-Transport-Security (HSTS) и другими.

  2. django.contrib.sessions.middleware.SessionMiddleware Включает поддержку сессий, позволяя хранить данные между запросами для каждого пользователя.

  3. django.middleware.csrf.CsrfViewMiddleware Добавляет защиту от атак типа "Межсайтовая подделка запроса" (CSRF) путем проверки специального токена в POST-запросах.

  4. django.contrib.auth.middleware.AuthenticationMiddleware Добавляет объект user (request.user) к каждому входящему объекту HttpRequest, представляя текущего залогиненного пользователя.

Пример кастомного Middleware

Вы можете легко создавать свои Middleware для решения специфичных задач, например, для логирования времени выполнения запроса.

# myapp/middleware.py
import time

class TimingMiddleware:
    def __init__(self, get_response):
        # Выполняется один раз при инициализации сервера
        self.get_response = get_response

    def __call__(self, request):
        # Код, который выполняется перед вызовом view
        start_time = time.time()

        response = self.get_response(request)

        # Код, который выполняется после вызова view
        duration = time.time() - start_time
        print(f"View executed in {duration:.2f}s")

        return response

Регистрация в settings.py

Чтобы Middleware заработало, его нужно добавить в список MIDDLEWARE:

# settings.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    # ... другие middleware
    'myapp.middleware.TimingMiddleware', # Наш Middleware
    # ...
]

Важно: Порядок Middleware имеет значение. При обработке запроса они выполняются сверху вниз, а при обработке ответа — в обратном порядке, снизу вверх.