Django因此提供對全局 context處理器的支持。TEMPLATE_CONTEXT_PROCESSORS指定了總是使用哪些contextprocessors。這樣就省去了每次使用RequestContext都指定processors的麻煩^_^。
默認情況下,TEMPLATE_CONTEXT_PROCESSORS設置如下:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
)
這個設置是一個可調用函數的Tuple,其中的每個函數使用了和上文中我們的custom_proc相同的接口:接收一個request對象作為參數,返回一個包含了將被合并到context中的項的字典。請注意TEMPLATE_CONTEXT_PROCESSORS中的值是以 strings的形式給出的,這意味著這些處理器必須在你的python路徑中的某處(這樣你才能在設置中引用它們)
每個處理器將會按照順序應用。也就是說如果你在第一個處理器里面向context添加了一個變量,而第二個處理器添加了同樣名字的變量,那么第二個將會覆蓋第一個。
Django提供了幾個簡單的context處理器,有些在默認情況下被啟用的。
django.core.context_processors.auth
如果TEMPLATE_CONTEXT_PROCESSORS包含了這個處理器,那么每個RequestContext將包含這些變量:
§ user:一個django.contrib.auth.models.User實例,描述了當前登錄用戶(或者一個AnonymousUser實例,如果客戶端沒有登錄)。
§ messages:一個當前登錄用戶的消息列表(字符串)。在后臺,對每一個請求這個變量都調用request.user.get_and_delete_messages()方法。這個方法收集用戶的消息然后把它們從數據庫中刪除。
§ perms:django.core.context_processors.PermWrapper的一個實例,包含了當前登錄用戶有哪些權限。
關于users、permissions和messages的更多內容請參考第12章。
django.core.context_processors.debug
這個處理器把調試信息發(fā)送到模板層。如果TEMPLATE_CONTEXT_PROCESSORS包含了這個處理器,RequestContext將包含這些變量:
§ debug:你設置的DEBUG的值(True或False)。你可以在模板里面用這個變量測試是否處在debug模式下。
§ sql_queries:包含類似于{'sql':...,'time':...}的字典的一個列表,記錄了這個請求期間的每個SQL查詢以及查詢所耗費的時間。這個列表是按照請求順序進行排列的。
由于調試信息比較敏感,所以這個context處理器只有當同時滿足下面兩個條件的時候才有效:
§ DEBUG參數設置為True。
§ 請求的ip應該包含在INTERNAL_IPS的設置里面。
django.core.context_processors.i18n
如果這個處理器啟用,每個RequestContext將包含下面的變量:
§ LANGUAGES:LANGUAGES選項的值。
§ LANGUAGE_CODE:如果request.LANGUAGE_CODE存在,就等于它;否則,等同于LANGUAGE_CODE設置。
附錄E提供了有關這兩個設置的更多的信息。
django.core.context_processors.request
如果啟用這個處理器,每個RequestContext將包含變量request,也就是當前的HttpRequest對象。注意這個處理器默認是不啟用的,你需要激活它。
寫Context處理器的一些建議
編寫處理器的一些建議:
§ 使每個context處理器完成盡可能小的功能。使用多個處理器是很容易的,所以你可以根據邏輯塊來分解功能以便將來重用。
§ 要注意TEMPLATE_CONTEXT_PROCESSORS里的context processor 將會在每個模板中有效,所以要變量的命名不要和模板的變量沖突。變量名是大小寫敏感的,所以processor的變量全用大寫是個不錯的主意。
§ 只要它們存放在你的Python的搜索路徑中,它們放在哪個物理路徑并不重要,這樣你可以在TEMPLATE_CONTEXT_PROCESSORS設置里指向它們。也就是說,你要把它們放在app或者project目錄里名為context_processors.py的文件。
posted on 2008-12-01 22:28
周銳 閱讀(1240)
評論(0) 編輯 收藏 所屬分類:
Python