Middleware Django: пользовательское ПО промежуточного слоя

Проектируя высокомасштабируемые веб-приложения очень важно знать о каждом нюансе в том, как работает связующее, межплатформенное, промежуточное программное обеспечение: Python Django middleware.

Из руководства вы узнаете всё о связующем программном обеспечении в Django, зачем его использовать, как оно работает и как настроить пользовательский Django middleware.

Ознакомьтесь с оглавлением: 

  1. Что такое Middleware?
  2. Как работает Django Middleware?
  3. Пользовательский Django Middleware.
  4. Специальные методы Django Middleware на основе классов.
  5. Основные принципы работы Middleware.

1. Что такое Middleware?

С точки зрения пользователя 👨💼  —  Middleware (программное обеспечение промежуточного слоя, связующее, межплатформенное ПО)  —  это словно мост, связывающий между собой две части программы или системы.

В технических терминах 👨💻  —  Django Middleware  —  это промежуточный слой между запросом и ответом, это легкая, низкоуровневая система “плагинов” для глобального изменения входных или выходных данных. Каждый компонент промежуточного слоя отвечает за выполнение определенной функции.


2. Как работает Django Middleware?

Схема работы Django Middleware

Когда пользователь инициирует запрос из вашего приложения, создается обработчик WSGI, выполняющий следующие действия по порядку:

  • Импорт модуля settings.py из корневой директории проекта.
  • Импорт классов исключений Django.
  • Загрузка всех классов связующего ПО, указанных в кортеже MIDDLEWARE из модуля settings.py.
  • Построение списка методов для обработки представлений, исключений, запросов и ответов.
  • Перебор методов запроса (request) по порядку.
  • Выдача прав доступа к запрошенному ресурсу по URL.
  • Обход каждого из методов обработки представлений (views) по порядку.
  • Вызов функции представления или метода dispatch() для представления-класса.
  • Обработка методов выброса исключений, если такие есть.
  • Обход каждого из методов ответа (response) в обратном порядке от обхода методов запроса.
  • Построение возвращаемого значения и выполнение функции обратного вызова (callback).

4. Пользовательский Django Middleware

Django предоставляет два типа связующего программного обеспечения:

  1. Стандартные (встроенные) Middleware.
  2. Пользовательские Middleware.

Стандартное связующее ПО предоставляется по умолчанию, когда вы создаете свой новый Django-проект; проверить список Middleware по умолчанию можно в модуле settings.py из корневой директории проекта:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Встроенное промежуточное ПО Django по умолчанию

Пользовательское связующее ПО  —  это ваши собственные Middleware для использования во всем проекте. Давайте рассмотрим, как их писать:

  • Создайте Python-пакет (папку с файлом __init__.py внутри) под названием middleware.
  • В директории пакета создайте модуль под названием custom_middleware.py, определите обычную функцию либо класс.
  • Теперь всё готово для создания ПО промежуточного слоя в форме функции или класса с вызываемыми экземплярами.

Пользовательский Django Middleware на основе функции:

def simple_middleware(get_response):
    # Инициализация и настройка
    def middleware(request):
        # Код, вызываемый перед представлением при каждом запросе.
        response = get_response(request)

        # Код, вызываемый после представления при каждом запросе.
        return response

    return middleware

Пользовательский Django Middleware на основе класса:

class ExampleMiddleware:

    def _init_(self, get_response):
        self.get_response = get_response

    def _call_(self, request):

        # Код, вызываемый перед представлением при каждом запросе.
        response = self.get_response(request)

        # Код, вызываемый после представления при каждом запросе.
        return response

    def process_view(request, view_func, view_args, view_kwargs):
        # Код, вызываемый непосредственно перед кодом представления.

    def process_exception(request, exception):
        # Код, вызываемый при выбросе исключения.

    def process_template_response(request, response):
        # Код, вызываемый при наличии в запросе метода render().
        return response

Напоследок перейдите в корневую директорию проекта и добавьте ваше новое пользовательское промежуточное ПО в список MIDDLEWARE из модуля settings.py:

MIDDLEWARE = [
    …
    'your_app.middleware_directory.custom_middleware_file.CustomMiddleware_class',
]

Добавление пользовательского Middleware в файл settings.py

Всё готово! ✔ 
Воспользуйтесь на практике новым пользовательским связующим ПО.


5. Специальные методы Django Middleware на основе классов

  • process_request:
    когда Django проходит через метод process_request в каждом из Middleware, то с помощью константы ROOT_URLCONF , указанной в settings.py, создаётся объект запроса. После обхода всех связующих ПО по очереди сверху вниз, Django решает, какое из представлений вызвать непосредственно следом за созданием объекта запроса.
  • process_view(request, view_func, view_args, view_kwargs)
    рассмотрим формальные параметры, где request  —  это объект-экземпляр HttpRequest, а view_func  —  это функция, которая вызывается непосредственно перед представлением.
  • process_response
    данный метод составляет ответ, объект-экземпляр класса HttpResponse  —  конечный результат, получаемый после выполнения process_responseв каждом из связующих ПО.
  • process_template_response(request, response)
    среди формальных параметров request  —  это объект-экземпляр класса HttpRequest, а response  —  это объект-экземпляр класса TemplateResponse (или эквивалент), ранее возвращенный представлением Django или другим связующим ПО.
  • process_exception(request, exception)
    данный метод вызывается, когда представление выбрасывает исключение; обратите внимание на формальные параметры, где request  —  это объект-экземпляр класса HttpRequest, а exception  —  это объект-экземпляр класса Exception, выброшенный функцией или методом представления.

6. Основные принципы работы Middleware

  • При указании связующего программного обеспечения в списке MIDDLEWARE из модуля settings.py необходимо соблюдать порядок сверху вниз! Порядок вызова Middleware важен для правильной работы приложений, уделяйте внимание соответствующим указаниям из документации библиотек Django, которые вы подключаете к своему проекту.
  • Расширять связующее программное обеспечение можно только посредством класса. 
  • Связующее программное обеспечение может как реализовывать, так и не реализовывать различные методы.
  • Связующее программное обеспечение обязательно реализовывает метод process_request, но никогда НЕ реализовывает методы process_response и process_view.

Спасибо за чтение! 

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи: Everything you need to know about Middleware in Django!

Предыдущая статьяТестирование производительности: rust/warp против go/fasthttp
Следующая статья6 полезных библиотек JavaScript