Django. Middleware
Пишем собственный middleware.
Middleware factory - это вызываемый объект, который принимает вызываемый объект get_response и возвращает middleware.
Middleware - это вызываемый объект, который принимает request, а возвращает response (прямо как view).
Так как middleware factory и сам middleware должны быть просто callabale. Возможны минимум 2 реализации
def simple_middleware(get_response): # One-time configuration and initialization. def middleware(request): # Code to be executed for each request before # the view (and later middleware) are called. response = get_response(request) # Code to be executed for each request/response after # the view is called. return response return middleware
Здесь simple_middleware - это фабрика. simple_middlware() вызывается при старте сервера, а объект, который она вернула (middleware) вызывается каждый раз, когда происходит обработка запроса сервером.
Альтернативная (и эквивалентная) реализация middleware через класс выглядит так:
class SimpleMiddleware:
def __init__(self, get_response): self.get_response = get_response # One-time configuration and initialization. def __call__(self, request): # Code to be executed for each request before # the view (and later middleware) are called. response = self.get_response(request) # Code to be executed for each request/response after # the view is called. return response
Middleware можно отключать в любой момент. Для этого в методе __init__() можно сгенерировать исключение MiddlewareNotUsedException (как и все исключения django он лежит в модуле django.core.exceptions).
Есть замечательная особенность. Когда запрос идёт от браузера к серверу он проходит через все middleware в прямом порядке, а затем в обратном. "Разворот" осуществляется в точке self.get_response(request).
def __call__(self, request):
print("HELLO from middleware")
# прямой проход по middleware
response = self.get_response(request) # формирование ответа
# обратный проход по middleware
return response
Для того, чтобы middleware заработал достаточно в файле settings.py указать строкой путь к middleware:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'one.middleware.SayHelloMiddleware',
]
Выполнение middleware происходит сверху вниз в прямом порядке и снизу вверх при проходе в обратную сторону.
Комментарии
Отправить комментарий