Django でスレッドセーフなコンテキスト プロセッサを作成するためのベスト プラクティスは何ですか?
たとえば、いくつかの変数をテンプレートに渡したいとします。これらの変数は、対応するビューに設定されており、ビューとテンプレートのペアごとに異なる可能性があります。
1 つの解決策は、コンテキスト内の各変数を手動で渡すことです。
return render_to_response('template.html', {'var1':var1,... 'var10':var10},
context_instance=RequestContext(request))
ただし、それを DRY に保つには、むしろコンテキスト プロセッサを使用します。しかし、グローバル ストアが必要なように見えるため、スレッド セーフが心配です。これは、各変数をリクエストに結び付けるコンテキスト プロセッサを使用した私のソリューションです。コメントと提案をありがとう。
で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',
)