Django. Middleware

 


Middleware для django - это способ внедриться в процесс обработки запроса от клиента.
Пишем собственный 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 происходит сверху вниз в прямом порядке и снизу вверх при проходе в обратную сторону.


    

Комментарии

Популярные сообщения из этого блога

Сброс счётчика неудачных попыток входа

python: магические (dunder) методы

Настройка ubuntu для сервера Nginx (python3.8)