Django中全局Context处理器
1.模板标签和模板变量
模板标签在{% %}中定义:
- {% if is_logged_in %}
- Thanks for logging in!
- {% else %}
- Please log in.
- {% endif %}
模板变量在 { }中定义:
- My first name is {{ first_name }}. My last name is {{ last_name }}.
2.Context处理器和 RequestContext处理器
context 是一个传递给模板的名称到值的映射(类似Python字典)。通过从context获取值来替换模板中变量并执行所有的模板标签来实现模板渲染。
- from django.template import loader, Context
- def view_1(request):
- # ...
- t = loader.get_template('template1.html')
- c = Context({
- 'app': 'My app',
- 'user': request.user,
- 'ip_address': request.META['REMOTE_ADDR'],
- 'message': 'I am view 1.'
- })
- return t.render(c)
- def view_2(request):
- # ...
- t = loader.get_template('template2.html')
- c = Context({
- 'app': 'My app',
- 'user': request.user,
- 'ip_address': request.META['REMOTE_ADDR'],
- 'message': 'I am the second view.'
- })
- return t.render(c)
在上述代码中定义了两个视图,他们除了message不同其余信息都相同,而这样分别定义显然是冗余的。所以需要引入 RequestContext处理器。
- from django.shortcuts import render_to_response
- from django.template import RequestContext
- def custom_proc(request): # context处理器,它接收一个 HttpRequest 对象,然后返回一个字典
- "A context processor that provides 'app', 'user' and 'ip_address'."
- return {
- 'app': 'My app',
- 'user': request.user,
- 'ip_address': request.META['REMOTE_ADDR']
- }
- def view_1(request):
- # ...
- return render_to_response('template1.html',
- {'message': 'I am view 1.'},
- context_instance=RequestContext(request, processors=[custom_proc])) # 接受processors参数
- def view_2(request):
- # ...
- return render_to_response('template2.html',
- {'message': 'I am the second view.'},
- context_instance=RequestContext(request, processors=[custom_proc]))
上述代码中利用 render_to_response 代替了render使得可以不用手动载入模板。值得注意的是,在上面这种方法中虽然看似减少了冗余代码,但是由于需要不断键入processors参数,所以依然不够简洁。
所以djang提供对全局 context 处理器的支持。在settings.py 中,有类似代码:
- TEMPLATES = [
- {
- 'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [
- os.path.join(BASE_DIR, 'templates')
- ],
- 'APP_DIRS': True,
- 'OPTIONS': {
- 'context_processors': [ # 以下定义了默认的全局文本处理器
- 'django.template.context_processors.debug',
- 'django.template.context_processors.request',
- 'django.contrib.auth.context_processors.auth',
- 'django.contrib.messages.context_processors.messages',
- 'blog.views.custom_proc', # 见下文代码
- ],
- },
- },
- ]
以下方法实现全局化文本处理器。
- 建议在项目的应用(app)或项目(project)下创建一个叫做
context_processors.py的文件。只要它们存放在你的Python的搜索路径中,它们放在哪个物理路径并不重要,这样你可以在CONTEXT_PROCESSORS设置里指向它们。
- 在context_processors.py中创建你需要定义的处理器,使每个context处理器完成尽可能小的功能。
- 将该文本处理器引入到 context_processors 目录下,如上文代码。
特别的,不去额外定义 context_processors.py ,而在 views.py 中直接写好 custom_proc 后,则可以将其目录加入到 context_processors 中。eg:上述代码中的 def custom_proc(request):
3. 调用 settings.py 中的配置信息作为全局调用
- 在 settings.py 中加入你要替换的信息:
- SITE_NAME = '。。。的个人博客'
- SITE_DESC = 'Python开发 && Django开发'
- 在 views.py 中引入参数:
- from django.conf import settings
- def global_setting(request):
- return {'SITE_NAME': settings.SITE_NAME,
- 'SITE_DESC': settings.SITE_DESC,}
- 在 settings.py 中 TEMPLATE的文本处理器中加入
- 'blog.views.global_setting',
至此,这种方法也不需要在render 或 render_to_response 中指明 context 或 RequestContext 就可以直接在HTML模板中利用模板变量来进行渲染。
相比之下,还是方法2中较简单。
Django中全局Context处理器的更多相关文章
- Spring Boot 中全局异常处理器
Spring Boot 中全局异常处理器,就是把错误异常统一处理的方法.等价于Springmvc中的异常处理器. 步骤一:基于前面的springBoot入门小demo修改 步骤二:修改HelloCon ...
- [django]自定义全局context
1. 创建一个context processor函数 新建一个文件命名为custom_processors.py,把它放到项目app文件夹(例如我的blog文件夹),添加一个返回字典的函数,其代码如下 ...
- Django框架中的Context使用
Django框架中的Context使用 2017年11月09日 20:01:09 aweilark 阅读数:1113 转载自:http://www.aichengxu.com/python/606 ...
- springmvc中拦截器与springmvc全局异常处理器的问题
最近在做一个练手的小项目, 系统架构中用了springmvc的全局异常处理器, 做了系统的统一异常处理. 后来加入了springmvc的拦截器, 为了一些需求, 在拦截器中的 preHandle 方法 ...
- Python的Django框架中的Context使用
Python的Django框架中的Context使用 近期整理些Python方面的知识,一旦你创建一个 Template 对象,你能够用 context 来传递数据给它. 一个context是一系列变 ...
- SpringBoot项目中的全局异常处理器 Failed to invoke @ExceptionHandler method
文件下载代码 @RequestMapping(value = { "/data/docking/picture/{id}/{empi}" }) public JsonApi pic ...
- Django中的信号
信号 Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到. 简单来说,信号允许特定的sender通知一组receiver某些操作已经发生. 这在多处代码和同一事件 ...
- 设置全局context变量 (显示用户登录名)
比如在每个页面的最上面部分需要显示用户的登录名称,如果不登录则显示为Guest.这部分内容在每个页面都会出现,所以可将该部分内容作为一个公共模板(如userauth.html),如然后在其他模板中进行 ...
- Django——12 中间件 上下文处理器 admin后台
Django 中间件 中间件介绍 中间件的第一个例子 中间件的第二个例子 上下文处理器 admin后台管理 中间件 Django中间件(Middleware)是一个轻量级.底层的“插件”系统,可以 ...
随机推荐
- P3312 [SDOI2014]数表
啊啊啊我昨天怎么没写题解wwww 补昨日题解... 题目链接 : https://www.luogu.org/problemnew/show/P3312 也是莫反 我要把fft留到今天写 [和zyn小 ...
- 【GYM 102059】2018-2019 XIX Open Cup, Grand Prix of Korea
vp了一场gym,我又开心地划水了. A. Coloring Roads 题意:给定一棵树,树边一开始都是无色的,每次操作可以把一个点到根的路径染成某个颜色,每次询问当前树上出现过某个次数的颜色种数. ...
- luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)
带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...
- wordcloud词云
借鉴别人的一个小例子,快速生成词云的代码: from wordcloud import WordCloud f = open(u'txt/AliceEN.txt','r').read() wordcl ...
- 【Codeforces 98E】 Help Shrek and Donkey
http://codeforces.com/problemset/problem/98/E (题目链接) 题意 A君有n张牌,B君有m张牌,桌上还有一张反扣着的牌,每张牌都不一样. 每个回合可以做两件 ...
- Linux 系统缓存机制学习
前言:本文为参考他人的文章,是一篇学习记录型博客.理解linux的系统缓存机制有助于理解elasticsearch实时更新的原理. 一.缓存机制 为了提高文件系统性能,内核利用一部分物理内存分配出缓冲 ...
- oracle 按 123456789 排序 而不是 1 10 11 2 这种
order by decode(trim(translate(cptm,'0123456789',' ')),null,to_number(cptm))
- IDEA进行远程调试
biz-test本地调用测试环境01机器上面的needle项目,卡在查询数据库的地方(Jade停住不走了) 首先配置 相关项目 的服务器端部署jvm参数: 在needle的config.pp.temp ...
- theano使用
一 theano内置数据类型 只有thenao.shared()类型才有get_value()成员函数(返回numpy.ndarray)? 1. 惯常处理 x = T.matrix('x') # t ...
- 题解【bzoj4650 [NOI2016]优秀的拆分】
Description 求对每一个连续字串将它切割成形如 AABB 的形式的方案数之和 Solution 显然 AABB 是由两个 AA 串拼起来的 考虑维护两个数组 a[i] 和 b[i] ,其中 ...