В этом посте вы узнаете, как создать собственное промежуточное программное обеспечение Django и как вводить данные в контекст зрения непосредственно от промежуточного программного обеспечения.
Что такое промежуточное программное обеспечение Django и что используется?
Я недавно был интересный случай, когда мне нужно Введите динамические данные в контексте представления Django .
Данные не пришли из базы данных. Мне нужно было служить разным объектам В зависимости от запроса Meta http_accept_Language и сделать эти данные доступными из интерфейса JavaScript.
Строительство промежуточного программного обеспечения Django было естественным решением. А Промежуточное программное обеспечение Django похоже на плагин, которую вы можете подключить к циклу запроса/ответа Django Отказ
В этом посте вы узнаете, как создать собственное промежуточное программное обеспечение Django и как вводить данные в контекст зрения непосредственно от промежуточного программного обеспечения.
Настройка проекта
Создайте новую папку для проекта Django и перейдите в него:
mkdir make-me-middleware && cd $_
Оказавшись внутри создать виртуальную среду Python и активировать ее:
python3 -m venv venv source venv/bin/activate
Следующий Установить Django:
pip install django
И создать новый проект Django:
django-admin startproject make_me_middleware .
Наконец создайте новое приложение Django, я позвоню моим Middleware_demo :
django-admin startapp middleware_demo
И теперь давайте доберемся до работы!
Строительство промежуточного программного обеспечения Django
А Промежуточное программное обеспечение Django может жить внутри класса Python реализация хотя бы Две методы дублирования : init и звонок.
В промежуточной программе Django init называется, как только сервер запускается, пока Звоните вызывается для каждого нового запроса на приложение Django.
С этим знанием в руке создайте новый файл под названием Middleware.py в Middleware_demo и создать новое промежуточное программное обеспечение с именем Jsontranslationmiddleware :
# file: middleware_demo/middleware.py class JSONTranslationMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request) return response
Вы также можете увидеть, что init принимает get_response , пока Вызов возвращает тот же объект после запроса в качестве параметра Отказ
Этот шаг важен, чтобы приложение Django работать. get_response. На самом деле будет фактический взгляд или просто еще одно промежуточное программное обеспечение в цепочке.
Метод init может иметь одноразовые конфигурации и переменные экземпляров, а также в моем случае я объявил словарь Python с парой других вложенных словарей:
# file: middleware_demo/middleware.py class JSONTranslationMiddleware: def __init__(self, get_response): self.get_response = get_response self.translations = { "en": {"greeting": "Hello", "header": "Welcome Django!"}, "nl": {"greeting": "Hallo", "header": "Welkom Django!"}, } def __call__(self, request): response = self.get_response(request) return response
В следующем разделе вы увидите, где происходит волшебство …
Ответы шаблонов и промежуточных программных программ
А промежуточное программное обеспечение может быть крючки То есть методы классов, которые перехватывают ответы Django или взгляды во время их жизненного цикла.
Мои требования были понятны: мне нужно было ввести Self.Translations в контекст зрения.
(Настоящее приложение является более сложным и загружает переводы из нескольких файлов).
Для тех новых в Джанго, Контекст – это любые данные, которые представление должно представлять пользователю Отказ
К счастью, промежуточное программное обеспечение предлагает крючок, сделанный для манипуляций контекста: process_template_response. . Это требует запроса и ответа и имеет доступ к контексту через Ответ.context_data . Отказ
Вот реализация:
# file: middleware_demo/middleware.py class JSONTranslationMiddleware: def __init__(self, get_response): self.get_response = get_response self.translations = { "en": {"greeting": "Hello", "header": "Welcome Django!"}, "nl": {"greeting": "Hallo", "header": "Welkom Django!"}, } def __call__(self, request): response = self.get_response(request) return response def process_template_response(self, request, response): response.context_data["translations"] = self.translations return response
С Process_Template_Response имеет доступ к запросу Вы можете запрашивать любой ключ на запрос. МЕТА .
Представь, я хочу служить Self.Translations [«NL»] Только если у пользователя есть голландский язык в заголовке Django http_accept_Language. Вот как это будет выглядеть так:
# file: middleware_demo/middleware.py class JSONTranslationMiddleware: def __init__(self, get_response): self.get_response = get_response self.translations = { "en": {"greeting": "Hello", "header": "Welcome Django!"}, "nl": {"greeting": "Hallo", "header": "Welkom Django!"}, } def __call__(self, request): response = self.get_response(request) return response def process_template_response(self, request, response): if "nl" in request.META["HTTP_ACCEPT_LANGUAGE"]: response.context_data["translations"] = self.translations return response return response
Только небо – ваш лимит с промежуточным программным обеспечением.
Держать жестко, в следующем разделе Мы собираемся все кусочки вместе Отказ
Но ждать …
Если вы промежуточный разработчик Django, вы можете утверждать, что промежуточное программное обеспечение слишком много, Я мог бы проверить запрос. Мета прямо в виду Отказ
Но точка промежуточного программного обеспечения является четкое разделение проблем, а также способность Подключите промежуточное программное обеспечение в по мере необходимости.
Настройка вида и URL
Откройте make_me_middleware/urls.cy и включите URL-адреса от Middleware_demo:
# file: make_me_middleware/urls.py from django.contrib import admin from django.urls import path, include urlpatterns = [ path("admin/", admin.site.urls), path("", include("middleware_demo.urls")), ]
Затем создайте новый файл под названием URLS.PY в Middleware_demo :
# file: middleware_demo/urls.py from django.urls import path from .views import index urlpatterns = [ path("demo/", index), ]
Наконец-то давайте создадим вид Django с Templateresponse :
# file: middleware_demo/views.py from django.template.response import TemplateResponse def index(request): context = {} return TemplateResponse(request, "middleware_demo/index.html", context=context)
Эта точка зрения немного отличается от акций Django View, как те, которые вы можете видеть в Вводное руководство Отказ
Использует Templateresponse , специальный помощник, который является подключен процессором_template_response с промежуточного программного обеспечения Отказ
Templateresponse Не возвращает никаких данных обратно пользователю, пока не достигнет промежуточного программного обеспечения.
Чтобы коснуться результата вручную, давайте наконец создадим шаблон Django.
Строительство промежуточного программного обеспечения Django: настройка шаблона
Мой шаблон Django – это скромная HTML-страница, но с интересным дополнением: JSON_Script Django Filter Отказ
Начиная с любой клавиши из контекста JSON_Script создает новый тег сценария внутри страницы, с желаемым ID Отказ
Создать новую папку с именем Middleware_demo/Шаблоны/Middleware_demo и внутри его создавать index.html. :
Make me a Django middleware {{ translations|json_script:"translations" }}
Поскольку последний шаг мы собираемся активировать промежуточное программное обеспечение через минуту.
Активируя промежуточное программное обеспечение
Первые вещи сначала открываются make_me_middleware/settings.py и включить приложение:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # ENABLE THE NEW APP 'middleware_demo.apps.MiddlewareDemoConfig' ]
Затем включите промежуточное программное обеспечение:
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", # ENABLE THE NEW MIDDLEWARE "middleware_demo.middleware.JSONTranslationMiddleware", ]
Имейте в виду, что Indithwares пропускаются сверху вниз, когда есть запрос на приложение Django и от снизу вверх, когда ответ покидает приложение Отказ
Теперь запустите сервер:
python manage.py runserver
и посетить страницу http://127.0.0.1:8000/demo/ Отказ Откройте консоль браузера, и вы должны иметь доступ к словаре, теперь объект JavaScript который имеет был введен на промежуточное программное обеспечение :
Теперь вы можете проанализировать текст с JSON.BARSE, а также доступа к любой клавише на объекте:
JSON.parse(document.getElementById('translations').textContent).en.greeting
Прекрасная работа!
Вывод
В этом руководстве вы узнали, как Создайте промежуточное программное обеспечение Django Как ввести данные в контекст и как использовать json_script в ваших шаблонах.
Я действительно надеюсь, что вы узнали что-то новое! Django Hmidnwares – это правильное место для абстрагирования пользовательских функций, которые необходимо изменить цикл запроса/ответа приложения Django.
Держите свои приложения Django Clean.
Спасибо за чтение и оставаясь настроен!
Ресурсы
Django Документация для Hedmostwares
Django JSON_Script Документация
Исходный код для проекта
Если вы хотите копать глубже в Django и JavaScript, проверьте Джанго отдыхает с реагированием Отказ
Первоначально опубликовано на мой блог Отказ
Оригинал: “https://dev.to/valentinogagliardi/building-a-django-middleware-injecting-data-into-a-view-s-context-3c04”