没有在 Django 中调用 process_template_response

在views.py我使用render().


在 app -> middleware.py 我有这个代码:


from django.conf import settings



class 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总是空的。


为什么?


哆啦的时光机
浏览 95回答 1
1回答

呼唤远方

从文档(强调我的):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快捷方式,要么在其他地方执行您的逻辑。我认为您的逻辑可以在上下文处理器而不是中间件中实现。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python