Ответ
Middleware в Django — это система "хуков" (hooks) в цикл обработки запроса-ответа. Она позволяет выполнять код на разных этапах: до того, как запрос достигнет view-функции, и после того, как view-функция сгенерирует ответ.
Основная задача Middleware — глобальная обработка объектов запроса (request) и ответа (response).
Принцип работы
Middleware образуют цепочку, через которую последовательно проходит запрос. Порядок определяется списком MIDDLEWARE в файле settings.py.
- Обработка запроса:
requestпроходит через каждый middleware сверху вниз, от первого к последнему в спискеMIDDLEWARE. - Обработка View: Django вызывает соответствующую view-функцию.
- Обработка ответа:
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).
- Добавление кастомных заголовков к ответу.