【问题标题】:help with process_template_response django middlewareprocess_template_response django 中间件的帮助
【发布时间】:2011-03-17 02:24:45
【问题描述】:

我正在尝试使用 process_template_response 编写一个 django 中间件,但我似乎无法正常工作,任何人都可以帮我解决这个问题,或者举例说明如何使用该方法。

下面是我的代码:

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

谢谢

【问题讨论】:

  • 当你说“什么都没有显示”时,你检查过原始响应吗?
  • 你有一个错字是process_template_response而不是process_template_reponse

标签: django middleware


【解决方案1】:

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

【讨论】:

  • 我已经转换了我的视图,使它返回一个 TemplateResponse 而不是 HttpResponse 但仍然没有得到预期的输出。你认为你可以提供一个完整的例子来说明如何做到这一点吗?谢谢
【解决方案2】:

TL;DR:您必须使用TemplateResponse 呈现您的模板:

from django.template.response import TemplateResponse

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

当您使用从 django.shorcuts 导入的旧 render 渲染模板时,就会出现问题。正如documentation for process_template_response() 中所述,当响应为TemplateResponse 或等效项时,将调用此钩子。所以你应该做的是使用TemplateResponse来渲染你的模板,你的中间件就可以工作了。

您还可以将TemplateResponse 别名为render,这样您就不必更改所有视图。我个人不推荐这个。

from django.template.response import TemplateResponse as render

【讨论】:

  • 先生,你救了我的命!
【解决方案3】:

这是一个使用 process_template_response 方法的简单中间件的工作示例。

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

此中间件更改模板上下文数据中标题变量的值。通过将其添加到设置文件中的 MIDDLEWARE_CLASSES 来安装此中间件。然后访问 django 管理应用程序中的任何页面,您应该会看到页面的标题更改为 We changed the title

【讨论】:

    【解决方案4】:

    我已经解决了创建自定义模板标签的问题。我只是想知道如何在中间件中使用 process_template_reponse 添加上下文变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2011-06-15
      • 1970-01-01
      相关资源
      最近更新 更多