在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提取html文件中的特定数据的实现代码
Mar 24 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
浅谈python数据类型及类型转换
Dec 18 Python
将python代码和注释分离的方法
Apr 21 Python
python 获取文件下所有文件或目录os.walk()的实例
Apr 23 Python
Python实现按中文排序的方法示例
Apr 25 Python
查看django版本的方法分享
May 14 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
Python静态类型检查新工具之pyright 使用指南
Apr 26 Python
django修改models重建数据库的操作
Mar 31 Python
Python实现一个优先级队列的方法
Jul 31 Python
Python  Asyncio模块实现的生产消费者模型的方法
Mar 01 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
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
JavaScript暂停和继续定时器的实现方法
2016/07/18 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
2017/02/09 Javascript
Bootstrap Table使用整理(五)之分页组合查询
2017/06/09 Javascript
浅谈webpack组织模块的原理
2018/03/10 Javascript
vscode下的vue文件格式化问题
2018/11/28 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
Python有序字典简单实现方法示例
2017/09/28 Python
python批量创建指定名称的文件夹
2019/03/21 Python
简单了解python PEP的一些知识
2019/07/13 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
酒店总经理欢迎词
2014/01/15 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
美食节目策划方案
2014/05/31 职场文书
大学生就业自荐书
2014/06/16 职场文书
店面出租协议书范本
2014/11/28 职场文书
八年级数学教学反思
2016/02/17 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript