Рубрики
Без рубрики

Создание промежуточного программного обеспечения Django (впрыскивая данные в контекст зрения)

В этом посте вы узнаете, как создать собственное промежуточное программное обеспечение Django и как вводить данные в контекст зрения непосредственно от промежуточного программного обеспечения. Теги с JavaScript, Python, Django.

В этом посте вы узнаете, как создать собственное промежуточное программное обеспечение 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”