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
这个处理器把调试信息发送到模板层。如果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
周锐 阅读(1237)
评论(0) 编辑 收藏 所属分类:
Python