在Django中編寫線程安全上下文處理器的最佳做法是什麼?我想將一些變量傳遞給模板,其中 在相應視圖中設置,並且對於 不同的視圖模板對可能會不同。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',
)
由於某種原因,爲每個視圖添加'context'到'render_to_response'是討厭我。所以我遵循'django.comments.'中使用的設計,但您的意見是有道理的。謝謝。 – krishnapp 2012-03-24 02:48:19
如果你使用django 1.3+考慮使用'render'而不是'render_to_response'。添加'context'是很簡單的IMO,但添加'context_instance = RequestContext(request)'很煩人。新的'render'不需要這麼做......或者使用基於類的視圖,因爲它們也是滾動的。 – John 2012-03-26 19:22:07