在Django框架中编写Context处理器的方法


Posted in Python onJuly 20, 2015

写Context处理器的一些建议

编写处理器的一些建议:

    使每个context处理器完成尽可能小的功能。 使用多个处理器是很容易的,所以你可以根据逻辑块来分解功能以便将来复用。

    要注意 TEMPLATE_CONTEXT_PROCESSORS 里的context processor 将会在基于这个settings.py的每个 模板中有效,所以变量的命名不要和模板的变量冲突。 变量名是大小写敏感的,所以processor的变量全用大写是个不错的主意。

    不论它们存放在哪个物理路径下,只要在你的Python搜索路径中,你就可以在 TEMPLATE_CONTEXT_PROCESSORS 设置里指向它们。 建议你把它们放在应用或者工程目录下名为 context_processors.py 的文件里。

html自动转意

从模板生成html的时候,总是有一个风险——变量包了含会影响结果html的字符。 例如,考虑这个模板片段:

Hello, {{ name }}.

一开始,这看起来是显示用户名的一个无害的途径,但是考虑如果用户输入如下的名字将会发生什么:

<script>alert('hello')</script>

用这个用户名,模板将被渲染成:

Hello, <script>alert('hello')</script>

这意味着浏览器将弹出JavaScript警告框!

类似的,如果用户名包含小于符号,就像这样:

用户名

那样的话模板结果被翻译成这样:

Hello, <b>username

页面的剩余部分变成了粗体!

显然,用户提交的数据不应该被盲目信任,直接插入到你的页面中。因为一个潜在的恶意的用户能够利用这类漏洞做坏事。 这类漏洞称为被跨域脚本 (XSS) 攻击。 关于安全的更多内容,请看20章

为了避免这个问题,你有两个选择:

    一是你可以确保每一个不被信任的变量都被escape过滤器处理一遍,把潜在有害的html字符转换为无害的。 这是最初几年Django的默认方案,但是这样做的问题是它把责任推给你(开发者、模版作者)自己,来确保把所有东西转意。 很容易就忘记转意数据。

    二是,你可以利用Django的自动html转意。 这一章的剩余部分描述自动转意是如何工作的。

在django里默认情况下,每一个模板自动转意每一个变量标签的输出。 尤其是这五个字符。

  •     ``\ ``
  •     System Message: WARNING/2 (<string>, line 491); backlink
  •     Inline literal start-string without end-string.
  •     > 被转换为>
  •     '(单引号)被转换为'
  •     "(双引号)被转换为"
  •     & is converted to &

另外,我强调一下这个行为默认是开启的。 如果你正在使用django的模板系统,那么你是被保护的。
如何关闭它

如果你不想数据被自动转意,在每一站点级别、每一模板级别或者每一变量级别你都有几种方法来关闭它。

为什么要关闭它? 因为有时候模板变量包含了一些原始html数据,在这种情况下我们不想它们的内容被转意。 例如,你可能在数据库里存储了一段被信任的html代码,并且你想直接把它嵌入到你的模板里。 或者,你可能正在使用Django的模板系统生成非html文本,比如一封e-mail。
对于单独的变量

用safe过滤器为单独的变量关闭自动转意:

This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}

你可以把safe当做safe from further escaping的简写,或者当做可以被直接译成HTML的内容。在这个例子里,如果数据包含'',那么输出会变成:

This will be escaped: <b>
This will not be escaped: <b>

对于模板块

为了控制模板的自动转意,用标签autoescape来包装整个模板(或者模板中常用的部分),就像这样:

{% autoescape off %}
 Hello {{ name }}
{% endautoescape %}

autoescape 标签有两个参数on和off 有时,你可能想阻止一部分自动转意,对另一部分自动转意。 这是一个模板的例子:

Auto-escaping is on by default. Hello {{ name }}

{% autoescape off %}
 This will not be auto-escaped: {{ data }}.

 Nor this: {{ other_data }}
 {% autoescape on %}
 Auto-escaping applies again: {{ name }}
 {% endautoescape %}
{% endautoescape %}

auto-escaping 标签的作用域不仅可以影响到当前模板还可以通过include标签作用到其他标签,就像block标签一样。 例如:

# base.html

{% autoescape off %}
<h1>{% block title %}{% endblock %}</h1>
{% block content %}
{% endblock %}
{% endautoescape %}

# child.html

{% extends "base.html" %}
{% block title %}This & that{% endblock %}
{% block content %}{{ greeting }}{% endblock %}

由于在base模板中自动转意被关闭,所以在child模板中自动转意也会关闭.因此,在下面一段HTML被提交时,变量greeting的值就为字符串Hello!

<h1>This & that</h1>
<b>Hello!</b>

备注

通常,模板作者没必要为自动转意担心. 基于Pyhton的开发者(编写VIEWS视图和自定义过滤器)只需要考虑哪些数据不需要被转意,适时的标记数据,就可以让它们在模板中工作。

如果你正在编写一个模板而不知道是否要关闭自动转意,那就为所有需要转意的变量添加一个escape过滤器。 当自动转意开启时,使用escape过滤器似乎会两次转意数据,但其实没有任何危险。因为escape过滤器不作用于被转意过的变量。

Python 相关文章推荐
Python中用PIL库批量给图片加上序号的教程
May 06 Python
利用python实现xml与数据库读取转换的方法
Jun 17 Python
django实现同一个ip十分钟内只能注册一次的实例
Nov 03 Python
Django中使用celery完成异步任务的示例代码
Jan 23 Python
Python定时任务sched模块用法示例
Jul 16 Python
浅析PyTorch中nn.Module的使用
Aug 18 Python
Anaconda+Pycharm环境下的PyTorch配置方法
Mar 13 Python
解决django中form表单设置action后无法回到原页面的问题
Mar 13 Python
使用python批量转换文件编码为UTF-8的实现
Apr 03 Python
基于Pyinstaller打包Python程序并压缩文件大小
May 28 Python
通俗讲解python 装饰器
Sep 07 Python
Python自动化之批量处理工作簿和工作表
Jun 03 Python
详解Django框架中用context来解析模板的方法
Jul 20 #Python
Django中URLconf和include()的协同工作方法
Jul 20 #Python
在Python的Django框架中包装视图函数
Jul 20 #Python
Django中URL视图函数的一些高级概念介绍
Jul 20 #Python
Python的Django框架中从url中捕捉文本的方法
Jul 20 #Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 #Python
在Django中创建URLconf相关的通用视图的方法
Jul 20 #Python
You might like
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
php面向对象重点知识分享
2019/09/27 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
AngularJS封装指令方法详解
2016/12/12 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
Angular value与ngValue区别详解
2019/11/27 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
[48:39]Ti4主赛事胜者组第一天 EG vs NEWBEE 2
2014/07/19 DOTA
Python 流程控制实例代码
2009/09/25 Python
Python 用户登录验证的小例子
2013/03/06 Python
Python 文件读写操作实例详解
2014/03/12 Python
python使用tensorflow深度学习识别验证码
2018/04/03 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
python yield关键词案例测试
2019/10/15 Python
Tensorflow 卷积的梯度反向传播过程
2020/02/10 Python
Tensorflow 模型转换 .pb convert to .lite实例
2020/02/12 Python
python实现邮件循环自动发件功能
2020/09/11 Python
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
HTML5声音录制/播放功能的实现代码
2018/05/03 HTML / CSS
French Connection官网:女装、男装及家居用品
2019/03/18 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
人事专员工作职责
2014/02/22 职场文书
老公给老婆的保证书
2014/04/28 职场文书
质量保证书范本
2014/04/29 职场文书
机关领导干部作风整顿整改措施
2014/09/19 职场文书
学校师德师风整改措施
2014/10/27 职场文书
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android