posts - 431,  comments - 344,  trackbacks - 0

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()方法。这个方法收集用户的消息然后把它们从数据库中删除。

§                                 permsdjango.core.context_processors.PermWrapper的一个实例,包含了当前登录用户有哪些权限。

关于userspermissionsmessages的更多内容请参考第12章。

django.core.context_processors.debug

这个处理器把调试信息发送到模板层。如果TEMPLATE_CONTEXT_PROCESSORS包含了这个处理器,RequestContext将包含这些变量:

§                                 debug:你设置的DEBUG的值(TrueFalse)。你可以在模板里面用这个变量测试是否处在debug模式下。

§                                 sql_queries:包含类似于{'sql':...,'time':...}的字典的一个列表,记录了这个请求期间的每个SQL查询以及查询所耗费的时间。这个列表是按照请求顺序进行排列的。

由于调试信息比较敏感,所以这个context处理器只有当同时满足下面两个条件的时候才有效:

§                                 DEBUG参数设置为True

§                                 请求的ip应该包含在INTERNAL_IPS的设置里面。

django.core.context_processors.i18n

如果这个处理器启用,每个RequestContext将包含下面的变量:

§                                 LANGUAGESLANGUAGES选项的值。

§                                 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 周锐 阅读(1238) 评论(0)  编辑  收藏 所属分类: Python

只有注册用户登录后才能发表评论。


网站导航: