Проектируя высокомасштабируемые веб-приложения очень важно знать о каждом нюансе в том, как работает связующее, межплатформенное, промежуточное программное обеспечение: Python Django middleware.
Из руководства вы узнаете всё о связующем программном обеспечении в Django, зачем его использовать, как оно работает и как настроить пользовательский Django middleware.
Ознакомьтесь с оглавлением:
- Что такое Middleware?
- Как работает Django Middleware?
- Пользовательский Django Middleware.
- Специальные методы Django Middleware на основе классов.
- Основные принципы работы Middleware.
1. Что такое Middleware?
С точки зрения пользователя 👨💼 — Middleware (программное обеспечение промежуточного слоя, связующее, межплатформенное ПО) — это словно мост, связывающий между собой две части программы или системы.
В технических терминах 👨💻 — Django Middleware — это промежуточный слой между запросом и ответом, это легкая, низкоуровневая система “плагинов” для глобального изменения входных или выходных данных. Каждый компонент промежуточного слоя отвечает за выполнение определенной функции.
2. Как работает Django Middleware?
Когда пользователь инициирует запрос из вашего приложения, создается обработчик WSGI, выполняющий следующие действия по порядку:
- Импорт модуля
settings.py
из корневой директории проекта. - Импорт классов исключений Django.
- Загрузка всех классов связующего ПО, указанных в кортеже
MIDDLEWARE
из модуляsettings.py
. - Построение списка методов для обработки представлений, исключений, запросов и ответов.
- Перебор методов запроса (request) по порядку.
- Выдача прав доступа к запрошенному ресурсу по URL.
- Обход каждого из методов обработки представлений (views) по порядку.
- Вызов функции представления или метода
dispatch()
для представления-класса. - Обработка методов выброса исключений, если такие есть.
- Обход каждого из методов ответа (response) в обратном порядке от обхода методов запроса.
- Построение возвращаемого значения и выполнение функции обратного вызова (callback).
4. Пользовательский Django Middleware
Django предоставляет два типа связующего программного обеспечения:
- Стандартные (встроенные) Middleware.
- Пользовательские 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
.
Спасибо за чтение!
Читайте также:
- Django REST Framework: REST API на Python с нуля
- 4 совета Python Django разработчику
- Python Django: как изменить страницу ошибки 404?
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи: Everything you need to know about Middleware in Django!