Django中的线程安全模板上下文处理器?

时间:2012-03-21 19:46:42

标签: django django-templates thread-safety django-context

在Django中编写线程安全上下文处理器的最佳实践是什么?

说,我想将一些变量传递给模板,其中 在相应的视图中设置,可以是不同的 不同的视图 - 模板对。

一种解决方案是在上下文中手动传递每个变量:

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',
)

1 个答案:

答案 0 :(得分:0)

context_processors用于在每个视图中设置的上下文变量可用于每个模板。如果您具有特定于视图的视图,则该视图属于该视图。如果您正在尝试将视图特定上下文字典的构建推送到context_processor,那么如果其他任何人不得不触摸您的代码,那么您真的会产生不必要的头痛和地雷。使用这些工具来实现它们的用途。

此外,写作和阅读更容易:

context = {
    'var1': value1,
    'var2': value2,
}

而不是试图弄清楚这是做什么的:

context_processor.add_context(request, 'var1', value1)
context_processor.add_context(request, 'var2', value2)

或许你想要的是这样的:

def view(request):
    context = {}
    ...
    if x == y:
        context['var1'] = value1
    else:
        context['var2'] = value2
    ...
    return render_to_response('template.html', context,
            context_instance=RequestContext(request))

或者甚至可以使用context.update({ 'var1': value1 })

我错过了第二个更干的方式。考虑到你必须在每个需要这些变量的视图中都这样做......

如果您有可重复的上下文生成,请使用基于类的视图以合理的方式抽象出来。如果你真的只有10个变量而每个模板只需要其中的一些(但它们因模板而异),那么只需将所有模板都可用于所有模板即可。只要代数不贵,这就行得很好,并且请记住查询集是懒惰的,所以如果你从不评估它们,它们就永远不会命中db