中间件与上下文处理器,用于视图相关的导航/显示

dmy*_*ung 7 django

这是关于中间件和视图通信的 SO线程的一个非常类似的问题

我们希望为模板提供一组标准的上下文变量.因此,上下文处理器似乎是合适的,但是,上下文处理器似乎不是视图感知的.我们之前被迫检查调用堆栈以获取有关视图正在执行什么操作的上下文信息.

这就是我们看到中间件线程以及中间件的process_view()签名,它为我们提供了视图的句柄.

这似乎更接近我们的需求,但不允许我们修改上下文变量,其他中间件方法也没有.

因此,我们最初的想法是使用我们模板所需的所有全局和上下文信息来修改请求对象,并强制模板从{{request.something}}我们需要的特定信息中调用,例如{{request.viewname}}.

所以,我们的问题:

  • 修改/设置请求对象上的值是否可以将上下文/全局应用程序特定信息推送到模板?或者标准做法总是把它放到上下文中?
  • 是否有方法/技巧使上下文处理器视图意识到不涉及显式传递它或进行一些堆栈内省?
  • 是否middleware.process_response有机会修改上下文或是不可变的?

Dan*_*man 4

在中间件中根据请求设置变量是完全有效的 - 我一直这样做。

没有办法使用process_response它,因为那时模板已经被渲染了——此时你得到的只是HttpResponse包含一堆 HTML 的内容。

另一种方法可能是render_to_response使用您自己的函数进行包装,该函数获取上下文以及请求和模板,并根据需要对其进行修改,然后再交给实际的渲染函数。这样做的优点是可以修改实际上下文,但缺点是您必须记住在每个视图中调用它而不是默认函数。