2012-03-21 86 views
0

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

回答

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個變量,並且每個模板只需要其中的一部分(但是它們根據模板的不同而不同),那麼只需簡單地將所有模板都提供給所有模板。只要這代人不昂貴,這個工作很好,記住querysets是懶惰的,所以如果你從來沒有評價過他們,他們從來沒有打過分數據庫

+0

由於某種原因,爲每個視圖添加'context'到'render_to_response'是討厭我。所以我遵循'django.comments.'中使用的設計,但您的意見是有道理的。謝謝。 – krishnapp 2012-03-24 02:48:19

+0

如果你使用django 1.3+考慮使用'render'而不是'render_to_response'。添加'context'是很簡單的IMO,但添加'context_instance = RequestContext(request)'很煩人。新的'render'不需要這麼做......或者使用基於類的視圖,因爲它們也是滾動的。 – John 2012-03-26 19:22:07