Django自定义过滤器中is_safe和need_autoescape两个参数的理解
自定义template过滤器的方法参考文档,不再赘述
is_safe
文档说明过滤的两种最终形态,其中一种是设置register.filter(is_safe=True)
,但是对is_safe的具体作用说的云山雾绕的,而查了些博文只是简单的说is_safe可以关闭掉自动转义(这个说法是错误的!)
我尝试了加或者不加is_safe的效果
@register.filter
def demo(value):
return '<br>' + value
@register.filter(is_safe=True)
def demo(value):
return '<br>' + value
<li> {{ text|demo}} </li>
结果就是都对过滤器返回的结果进行了转义!
后来发现重点在于文档中的这一句话:
This flag tells Django that if a “safe” string is passed into your filter, the result will still be “safe” and if a non-safe string is passed in, Django will automatically escape it, if necessary.
这个标志告诉Django 如果"安全"的字符串传递到您的过滤,结果仍将是"安全",如果一个非安全字符串传递,如果必要Django 会自动转义它。
重点在于"安全",也就是文档中提到的SafeData
类型.文档中有提到'某些正常的字符串操作会将SafeData对象转换成普通的str或unicode对象,Django的过滤器在完成之后会修复这种破坏,并且很困难'.
这才是is_safe的意义所在:如果传入的value已经是SafeData对象,is_safe会告诉Django当前过滤器输出的数据不再需要转义.
至于SafeData类型数据的来源,我暂时只知道mark_safe()
函数会返回SafeData对象.
from django.utils.safestring import mark_safe
@register.filter()
def to_safe(value):
return mark_safe(value)
@register.filter(is_safe=True)
def demo(value):
return '<br>' + value
<li> {{ test|to_safe|demo }} </li>
这样的情况,demo过滤器接收到一个SafeData对象,其结果不会再转义(<br>换行符起作用了).
need_autoescape
如果在注册过滤器时添加了need_autoescape=True
,那么过滤器必须接收一个autoescape
参数,这样过滤器会捕捉其引用位置的自动转义是否开启,以决定你在过滤器中的行为.
引用下文档中的栗子:
@register.filter(needs_autoescape=True)
def initial_letter_filter(text, autoescape=True):
first, other = text[0], text[1:]
if autoescape:
esc = conditional_escape
else:
esc = lambda x: x
result = '<strong>%s</strong>%s' % (esc(first), esc(other))
return mark_safe(result)
该过滤器的输出通过mark_safe()
函数标记为"安全",这样可以保证在过滤器中引入的HTML标签可以实现.但是同样要考虑输入的安全问题.如果模板中autoescape
是开启的,说明我们已经认定这部分的数据是存在威胁的,所以需要在过滤器中手动对输入数据进行转义来保证其安全性.
Django自定义过滤器中is_safe和need_autoescape两个参数的理解的更多相关文章
- django 自定义过滤器中的坑.
今天在创建自定义过滤器的时候,设置已正常.但是在运行后报: 'filter' is not a valid tag library: Template library filter not found ...
- django自定义过滤器及模板标签
创建一个模板库 不管是写自定义标签还是过滤器,第一件要做的事是创建模板库(Django能够导入的基本结构). 创建一个模板库分两步走: 第一,决定模板库应该放在哪个Django应用下. 如果你通过 m ...
- Django自定义过滤器及标签
一.自定义过滤器 1.自定义过滤器文件存放位置 在APP应用下创建名为templatetags(该文件夹名固定)的文件包(包含__init__.py文件) 注意APP必须在setting中注册 即在s ...
- python的Web框架,Django自定义过滤器及标签
代码布局 有的时候框架给的过滤器不够用,需要自定义一些过滤器,所以就需要我们自己来定义一些过滤器等 自定义代码放置的路径 某个app特用(独有)的 - app 目录下的 templatetags文件夹 ...
- Django 自定义过滤器
设定自定义过滤器之前要现在配置文件内把自己项目名在 INSTALLED_APPS 内导入 #已安装的django应用 INSTALLED_APPS = [ 'django.contrib.admin' ...
- Django 自定义过滤器和模板标签
前提:自定义模板标签和过滤器必须位于Django的某个应用中,这个应用可以包含一个templatetags目录, 和models.py views.py 处于同一级目录.若这个templatetags ...
- django 自定义过滤器(filter)处理较为复杂的变量的实例
简述:django 在views中有数据需要通过字典(dict)的方式传递给template,该字典中又包含了字典,而且字典中的键值还是一个对象,在template中处理传递过来的数据的时候,字典不能 ...
- Django 自定义 过滤器和模板标签
代码布局(自定义的代码,放在哪里) 二种方式:1. 某个app特有的 -app 目录下,templatetags 文件夹 ** 必需是这个名称的包(目录中有__init__.py文件) -再到 ...
- django自定义过滤器和标签
1.自定义过滤器和标签的流程: 1.在某个app下创建一个名为templatetags(必需,且包名不可变)的包.假设我们在名为app01的app下创建了一个templatetags的包,并在该包下创 ...
随机推荐
- java伪代码
愚公移山的目标是毕力平险,指通豫南,达于汉阴,方法是扣石垦壤,箕畚运于渤海之尾 条件判断if(愚公死了)我的儿子替我完成.循环结构是“子又生孙,孙又生子,子子孙孙无穷匮也” import.java.大 ...
- CentOS7中安装MySQL5.7 (转)
安装必要的组件 yum install –y autoconf automake imake libxml2-devel expat-devel cmake gcc gcc-c++ libaio li ...
- 结对编程-四则运算-GUI
201421123022 王若凡 201421123026 欧阳勇 https://git.coding.net/ttoyy/sizeyunsuan-GUI.git a.需求分析: ...
- 【Beta】 第四次Daily Scrum Meeting
一.本次会议为第四次meeting会议 二.时间:10:00AM-10:20AM 地点:陆大楼 三.会议站立式照片 四.今日任务安排 成员 昨日任务 今日任务 林晓芳 查询app提醒功能模块和用户登录 ...
- 201521123063 JAVA程序设计 第二周学习总结
1.本周学习重点(2.27-3.5) java中的数组 以二维数组为例,数组名为scores,则 (1)先声明数组 int[][] scores;或int scores[][];或int[] scor ...
- Ubuntu下PHP MySQL环境搭建-upcoming-ChinaUnix博客
编程语言选择php5 , web服务器选择Apache2 ,后台数据库选择MySQL首先安装编译工具, 打开终端 sudo apt-get install build-essential autoco ...
- Java 第十周总结
1. 本周学习总结 2. 书面作业 1.finally (题目4-2) 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? finally创建一个代码块.该代 ...
- 201521123115《java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前 ...
- React Native 轻松集成分享功能(iOS 篇)
产品一直催我在 RN 项目中添加分享功能,一直没找到合适的库,今天让我看到了一个插件分享给大家. 在集成插件之前,需要在各大开放平台上成功注册应用,并通过审核(支持 3 个可选的主流平台).支持的平台 ...
- [01] Pattern类和Matcher类
在Java中,有个java.util.regex包,这是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 它主要有两个类: Pattern 一个正则表达式经编译后的表现模式,可以理解为 ...