0

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

1 回答 1

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 个变量并且每个模板只需要其中的一些(但它们因模板而异),那么只需将它们全部用于所有模板即可。只要一代不昂贵,这很好用,并记住查询集是惰性的,所以如果你从不评估它们,它们就永远不会命中数据库

于 2012-03-21T20:45:51.020 回答