在 Django 中编写线程安全上下文处理器的最佳实践是什么?
比如说,我想将一些变量传递给模板,这些变量在相应的视图中设置,并且对于不同的视图-模板对可能会有所不同。
一种解决方案是在上下文中手动传递每个变量:
return render_to_response('template.html', {'var1':var1,... 'var10':var10},
context_instance=RequestContext(request))
然而,为了保持干燥,我宁愿使用上下文处理器。但我担心线程安全,因为它似乎需要一个全局存储。这是我使用上下文处理器的解决方案,它将每个变量与请求联系起来。感谢您的意见和建议。
在context_processor.py
:
store = {}
def add_context(request, key, value):
if request not in store:
store[request] = {}
store[request][key] = value
return
def misc_context_processor(request):
return store.pop(request,{})
在views.py
:
import context_processor
def view(request):
...
if x == y:
context_processor.add_context(request,'var1','value1')
else:
context_processor.add_context(request,'var2','value2')
...
return render_to_response('template.html', {},
context_instance=RequestContext(request))
在settings.py
:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
...,
'appname.context_processor.misc_context_processor',
)