Новый формат middleware в Django 2
MIddleware (промежуточный слой) используются для модификации объекта приходящего запроса в представление (view) или для модификации объекта ответа, возвращаемого из представления. Они позволяют нам изменять запросы/ответы глобально.
Старый формат middleware
До версии Django 1.10, было 5 точек перехвата. Любой класс, имеющий методы process_request(), process_view(), process_exception(), process_template_response() и process_response() мог использоваться как middleware и указываться в настройка settings.py в параметре MIDDLEWARE_CLASSES.
Два первыз метода — process_request() и process_view() вызывались до вызова представления (view). Следующие три метода process_exception(), process_template_response() и process_response() исполнялись после того, как пердставление вернет объект ответа (response).
Новый формат middleware
Самое важное изменение при переводе проекта на Django 2 — это изменение MIDDLEWARE_CLASSES на MIDDLEWARE в файле settings.py, а MIDDLEWARE_CLASSES удалено.
Старые middleware должны быть классом, тогда как новые могут быть любыми вызываемыми объектами, которые принимают get_response или при ответе принимают request и возвращают response.
class TimeStampMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
request.timestamp = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')
response = self.get_response(request)
return response
Здесь get_response может быть представлением, которое возвращает ответ, или следующим middleware в списке. Следовательно, запрос обрабатывается в указанном порядке middleware, а ответ - в обратном порядке.
Для активации своего middleware необходимо добавить путь к нему в MIDDLEWARE в файле настроек settings.py:
MIDDLEWARE = [
'...',
'my_app.middleware.TimeStampMiddleware',
'...',
]
Обновление middleware
Django предоставляет миксин django.utils.deprecation.MiddlewareMixin, который должен расширять возможности старого формата middleware. Таким образом MiddlewareMixin преобразовывает объект класса в вызываемый. Например:
from django.utils.deprecation import MiddlewareMixin
class CustomMiddleware(MiddlewareMixin):
def process_request(self, request):
# Process the request
pass
def process_response(self, request, response):
# Process the response
return response
Вернуться на верх