
Что такое промежуточное ПО?
Промежуточное ПО в самом простом объяснении означает мост между двумя частями программы или системы или который обеспечивает связь между ними. Промежуточное ПО - это концепция, которая широко используется и является частью большинства фреймворков веб-приложений.
Зачем нам нужно промежуточное ПО?
Некоторые виды использования промежуточного программного обеспечения:
- Управление данными
- прикладные услуги
- обмен сообщениями
- аутентификация
- Управление API
- Управление сессией
- Интеграция между внутренними и внешними системами
Теперь перейдем к нашей теме промежуточного программного обеспечения в Django.
Промежуточное ПО в Django
Промежуточное ПО - это структура перехватчиков для обработки запросов / ответов Django. Каждое промежуточное ПО обычно предназначено для выполнения определенной цели.
Мы объявляем промежуточное ПО в Django в файле настроек как кортеж MIDDLEWARE или кортеж MIDDLEWARE_CLASSES. Следующая конфигурация MIDDLEWARE по умолчанию создается, когда мы запускаем проект в Django с помощью команды startproject.
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 уже есть подробные разделы по ним.
Ссылка: https://docs.djangoproject.com/en/2.2/ref/middleware/
Как написать собственное (настраиваемое) промежуточное ПО в Django?
Промежуточное ПО является вызываемым и может быть написано как функция или как класс.
# Writing as a function
def a_middleware(get_response):
def middleware(request):
# Code to be executed for each request before
# the view (and later middleware) are called.
# Call the view
response = get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
return middleware
# Writing as a class
class AnotherMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
# Call the view
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
# Add the middleware in middleware list in settings
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'/path_to_middleware_folder/AnotherMiddleware',
]
Промежуточное ПО необходимо добавить в список MIDDLEWARE или MIDDLEWARE_CLASSES, как указано выше. На этапе запроса промежуточное ПО будет вызываться в порядке сверху вниз, вызывая метод process_request, и в порядке снизу вверх, вызывая process_response во время фазы ответа.
Есть пять методов, которые мы должны понимать в цикле запрос-ответ Django, как описано ниже.
process_request: объект request будет создан, пока Django проходит через метод process_request в каждом промежуточном программном обеспечении. Django решает, какое представление должно быть вызвано вскоре после создания объекта request, с помощью ключа ROOT_URLCONF в файле настроек.process_response: ответ будет окончательным выводом, который Django обработает после выполнения метода process_response в каждом промежуточном программном обеспечении, которым будет объект HttpResponse.process_view(request, view_func, view_args, view_kwargs): request - это HttpRequest object и view_func - это вызываемая функция. Он будет вызываться непосредственно перед вызовом представления.process_exception(запрос, исключение): запрос - это объект HttpRequest. exception - это объект Exception, созданный функцией просмотра. Этот метод вызывается, когда представление вызывает исключение.process_template_response(запрос, ответ): запрос - это объект HttpRequest. response - это объект TemplateResponse (или эквивалент), возвращаемый представлением Django или промежуточным программным обеспечением.