为了账号安全,请及时绑定邮箱和手机立即绑定

没有在 Django 中调用 process_template_response

没有在 Django 中调用 process_template_response

哆啦的时光机 2022-07-26 21:52:10
在views.py我使用render().在 app -> middleware.py 我有这个代码:from django.conf import settingsclass NoTrackingMiddleware:    def __init__(self, get_response):        self.get_response = get_response    def __call__(self, request):        response = self.get_response(request)        return response    def process_template_response(self, request, response):        no_tracking = True if request.GET.get("NO_TRACKING", default=False) is not False else False        pub_id = "PUBLISHER_TEST" if no_tracking is True else settings.WFF_PUB_ID        response.context_data["no_tracking"] = no_tracking        response.context_data["pub_id"] = pub_id        return response在settings.py我有:MIDDLEWARE = [...    'app.middleware.NoTrackingMiddleware',]然而,如果我在它处放置一个断点,process_template_response它就会被忽略并且pub_id总是空的。为什么?
查看完整描述

1 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

文档(强调我的):

process_template_response()在视图完成执行后立即调用,如果响应实例有render()方法,则表明它是 aTemplateResponse或等效的。

您声明您正在使用django.http.shortcuts.render,其文档内容如下:

将给定的模板与给定的上下文字典相结合,并返回一个HttpResponse带有该呈现文本的对象。

Django 不提供返回 a 的快捷函数,TemplateResponse因为 的构造函数TemplateResponse提供与render().

因此render返回 a HttpResponse,而不是 a TemplateResponse,并且如上所述,process_template_response只为TemplateResponses 调用。

您要么需要将视图更改为 return TemplateResponse,而不是使用render快捷方式,要么在其他地方执行您的逻辑。我认为您的逻辑可以在上下文处理器而不是中间件中实现。


查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信