Ответ
Middleware (промежуточное ПО) в Django — это система "хуков" в цикле обработки запроса/ответа. Это компоненты, которые обрабатывают запрос перед тем, как он достигнет view, и ответ после того, как он будет сгенерирован view. Их можно представить как слои луковицы, через которые проходит каждый запрос и ответ.
Основные встроенные Middleware
Django поставляется с набором стандартных Middleware, которые включены в проект по умолчанию:
-
django.middleware.security.SecurityMiddleware
Обеспечивает несколько важных улучшений безопасности: управляет заголовкамиX-Content-Type-Options
,X-XSS-Protection
,Strict-Transport-Security
(HSTS) и другими. -
django.contrib.sessions.middleware.SessionMiddleware
Включает поддержку сессий, позволяя хранить данные между запросами для каждого пользователя. -
django.middleware.csrf.CsrfViewMiddleware
Добавляет защиту от атак типа "Межсайтовая подделка запроса" (CSRF) путем проверки специального токена вPOST
-запросах. -
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 имеет значение. При обработке запроса они выполняются сверху вниз, а при обработке ответа — в обратном порядке, снизу вверх.