Задать вопрос
@GeorgeRu

Как в django python с помощью промежуточного слоя middleware изменить содержимое страницы до ёё вывода render'ом во view?

https://docs.djangoproject.com/en/2.1/topics/http/...
В справочной информации указано какая часть кода выполняется до, какая после view.
Но ничего не сказано про то, как изменить сформированное содержимое страницы до её вывода после view.

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response


Вопрос, как обновить содержимое request или response, чтобы после self.get_response(request) на странице выводились обновлённые process_template_response данные?

Вырезка из кода:

my_middleware.py
class MyMiddleware(object):

    def __init__(self, get_response=None):
        if get_response is not None:
            self.get_response = get_response

    def __call__(self, request):
        request.test_context = '1. __call__'
        # print(request.test_context)
        self.process_request(request)
        response = self.get_response(request)
        response = self.process_template_response(request, response)
        return response

    def process_request(self, request):
        request.test_context += ' - 2. process_request'
        # print(request.test_context)

    def process_template_response(self, request, response):
        request.test_context += ' - 4. process_template_response'
        # print(request.test_context)
        return response


views.py
def test_context(request):
    request.test_context += ' - 3. view'
    # print(request.test_context)
    return render(request, 'my_app/test_context.html')


test_context.html
{{request.test_context}}

С помощью print отслеживаю изменение переменной request.test_context:
1. __call__
1. __call__ - 2. process_request
1. __call__ - 2. process_request - 3. view
1. __call__ - 2. process_request - 3. view - 4. process_template_response


Но на странице html выводится:
1. __call__ - 2. process_request - 3. view

Что нужно исправить, чтобы на странице увидеть

1. __call__ - 2. process_request - 3. view - 4. process_template_response

вместо

1. __call__ - 2. process_request - 3. view

?

Версии:
Django==2.1
Python==3.7
  • Вопрос задан
  • 318 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@GeorgeRu Автор вопроса
Пока что решил обходным путём:

my_render.py
from django.shortcuts import render

    def render_test_context(request, template_name):
        request.test_context += ' - 4. process_template_response'
        # print(request.test_context)
        return render(request, template_name)

views.py
from my_app.my_render import render_test_context

def test_context(request):
    request.test_context += ' - 3. view'
    # print(request.test_context)
    return render_test_context(request, 'my_app/test_context.html')
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Guest007
@Guest007
Django, Python, Linux и всё такое...
Если тебя не устраивает результат генерации страницы из шаблона во view - переделай шаблон. Переделай view. Для этого шаблоны и вьюхи и придуманы.

Вьюха на основе данных рендерит шаблон. В отрендеренном шаблоне (после вьюхи) уже нет никаких {{request.test_context}} и прочей машинерии. Есть только готовый к выдаче html. Поэтому там и не появится никакой "- 4. process_template_response"

Или используй инструменты по назначению или делай руками пост-процесс (грепами и регекспами меняй сгенерированный html). Но это реально странное решение. Что такого могло отсутствовать ДО вызова view, но появилось ПОСЛЕ и ты не можешь его теперь использовать в шаблоне потому что уже поздно?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы