помогите с промежуточным программным обеспечением process_template_response django - PullRequest
6 голосов
/ 17 марта 2011

Я пытаюсь написать промежуточное программное обеспечение django, используя process_template_response, но мне кажется, что оно не работает, кто-нибудь может мне помочь с этим или, может быть, привести пример использования этого метода.

ниже мой код:

class MiddleWare(object):
    def process_template_reponse(self, request, response):
        response.context_data = dict(title='title')
        response.template_name = 'pages/helloworld.html'
        return response

в settings.py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'proj.app.middleware.MiddleWare', # here my middleware
)

в шаблоне

<!-- nothing is showing -->
{% block title %}{{ title }}{% endblock %}

кстати я использую Django 1.3 rc 1

Спасибо

Ответы [ 4 ]

7 голосов
/ 17 марта 2011

http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-template-response

Используете ли вы новые SimpleTemplateResponse классы ответов?

Ваше представление должно возвращать SimpleTemplateResponse или подкласс, чтобы новый хук промежуточного программного обеспечения process_template_response заработал.

Скопировано из документации:

def my_view(request):
    # Create a response
    response = TemplateResponse(request, 'mytemplate.html', {})
    # Register the callback
    response.add_post_render_callback(my_render_callback)
    # Return the response
    return response
6 голосов
/ 07 апреля 2016

TL; DR : вы должны визуализировать ваши шаблоны с TemplateResponse:

from django.template.response import TemplateResponse

def myView(request):
    context = {'foo':'foo_value'}
    return TemplateResponse(request,'foo.html', context)

Проблема возникает при рендеринге ваших шаблонов со старым добрым render, импортированным из django.shorcuts. Как указано в документации для process_template_response(), эта ловушка вызывается, когда ответ TemplateResponse или эквивалентный. Поэтому вы должны использовать TemplateResponse для рендеринга ваших шаблонов, и ваше промежуточное ПО будет работать.

Вы также можете использовать псевдоним TemplateResponse как render, поэтому вам не нужно менять все свои представления. Я лично не рекомендую это.

from django.template.response import TemplateResponse as render
5 голосов
/ 08 апреля 2014

Вот рабочий пример простого промежуточного программного обеспечения, использующего метод process_template_response.

class ExampleMiddleware(object):
    def process_template_response(self, request, response):
        response.context_data['title'] = 'We changed the title'
        return response

Это промежуточное ПО изменяет значение переменной title в данных контекста шаблона. Установите это промежуточное ПО, добавив его в MIDDLEWARE_CLASSES в файле настроек. Затем перейдите на любую страницу в приложении администратора django, название которой должно измениться на Мы изменили название .

2 голосов
/ 29 марта 2011

Я решил свою проблему с созданием пользовательского тега шаблона. Мне просто интересно, как добавить переменную контекста, используя process_template_reponse в промежуточном программном обеспечении.

...