中间件与背景处理器为依赖于视图导航/显示
问题描述:
这是一个非常类似的问题本SO线程middleware and views communicating中间件与背景处理器为依赖于视图导航/显示
我们希望有我们的模板被赋予了一套标准的上下文变量。因此,上下文处理器看起来是合适的,但是,上下文处理器似乎并不像视图感知。之前我们被迫检查调用堆栈以获取关于哪个视图正在做什么的上下文信息。
这就是我们看到中间件线程以及process_view()
中间件签名的地方,该中间件为我们提供了视图的句柄。
这似乎更接近我们的需求,但不允许我们修改上下文变量,其他中间件方法也没有。
因此,我们的初衷是修改请求对象,使其包含我们模板所需的所有全局和上下文信息,并强制模板从{{request.something}}
调用我们需要的特定信息,例如{{request.viewname}}
。
所以,我们的问题:
- 正在修改的请求/设定值对象的接受的事情推上下文/全球应用程序的具体信息到你的模板吗?还是标准的做法总是把它放到上下文中?
- 是否有方法/技巧使上下文处理器查看意识,不涉及明确传递或进行一些堆栈自省?
-
middleware.process_response
是否有机会修改上下文或者它是不可变的?
答
在中间件的请求中设置变量是完全有效的 - 我一直都在这样做。
对此,无法使用process_response
,因为此时模板已经被渲染 - 此时您只能看到包含一堆HTML的HttpResponse
。
另一种可能是用自己的函数包装render_to_response
,该函数将上下文与请求和模板一起使用,并在切换到实际渲染函数之前根据需要对其进行修改。这具有修改实际上下文的优点,但缺点是必须实际记住在每个视图中调用它而不是默认函数。
答
您可以通过使用中间件和上下文处理器一起使用。中间件知道视图,并可以在请求上设置属性。然后,上下文处理器可以将请求上设置的任何内容移动到上下文中。
例如:
class ExtraContextMiddleware(object):
"""
Adds extra context to the response for certain views.
Works in tandem with the extra_context context processor.
"""
context_map = {
#Adds the supplied context dict to the named views
'my_view_name': {'foo': 'Hello', 'bar': 'Goodbye'},
}
def process_view(self, request, view, *args, **kwargs):
try:
request.extra_context = self.context_map[view.func_name]
except KeyError:
pass
然后上下文处理器:
def extra_context(request):
"""Context processor for adding extra context.
Works in tandem with ExtraContextMiddleware."""
try:
return request.extra_context
except AttributeError:
return {}
参见http://jboxer.com/2009/05/django-middleware-vs-context-processors/ – Ztyx 2010-09-13 13:25:40