所以我在我的URL配置中设置了一个路径:

path(
    "kitten/",
    views.Kitten.as_view(),
    name="kitten",
),

和一个处理程序,用于处理同一视图中丢失的URL.

handler404 = views.Kitten.as_view()

我有一些中间件,可以设置一些上下文数据:

class CookieConsentMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        return self.get_response(request)

    def process_template_response(self, request, response):
        response.context_data["hasCookie"] = False        
        return response

这个观点很直截了当,

class Kitten(TemplateView):
    template_name = "kitten.html"

模板打印hasCookie的值.

访问kitten/会正确显示hasCookie的值,但访问不存在的URL时,不会显示hasCookie的值(同时显示正确的模板)

将调试语句添加到中间件中,很明显,虽然为kitten/调用了process_viewprocess_template_responseprocess_exception,但这些都不是为不存在的URL调用的,因此没有调用代码来设置hasCookie的值.(无论应用程序启动时如何调用__init__)

Why does it not call the middleware when the URL is not found in the URLconf?

推荐答案

您的中间件确实会被调用,但不会调用其process_template_response方法,因为Django对异常处理程序的响应调用了render函数,使其不再是TemplateResponse对象.这可以在response_for_exception功能的code [GitHub]中看到:

# Force a TemplateResponse to be rendered.
if not getattr(response, "is_rendered", True) and callable(
    getattr(response, "render", None)
):
    response = response.render()

这是因为response_for_exceptionconvert_exception_to_response调用,convert_exception_to_response需要确保响应被呈现,因为它包装了链中的第一个和最后一个中间件.

似乎您正在使用中间件为您的上下文添加值,但这并不是最好的地方.相反,你应该写一个custom context processor,它将被称为一致.

Python相关问答推荐

跟踪我已从数组中 Select 的样本的最有效方法

使用LineConnection动画1D数据

如何从具有不同len的列表字典中创建摘要表?

将两只Pandas rame乘以指数

Polars:用氨纶的其他部分替换氨纶的部分

Pandas:将多级列名改为一级

如何在Pyplot表中舍入值

重置PD帧中的值

基于多个数组的多个条件将值添加到numpy数组

Pandas:填充行并删除重复项,但保留不同的值

pandas fill和bfill基于另一列中的条件

如何求相邻对序列中元素 Select 的最小代价

每次查询的流通股数量

如何获得满足掩码条件的第一行的索引?

在matplotlib中重叠极 map 以创建径向龙卷风图

如果服务器设置为不侦听创建,则QWebSocket客户端不连接到QWebSocketServer;如果服务器稍后开始侦听,则不连接

仅取消堆叠最后三列

我如何处理超类和子类的情况

为什么按下按钮后屏幕的 colored颜色 保持不变?

我如何为测试函数的参数化提供fixture 生成的数据?如果我可以的话,还有其他 Select 吗?