自定义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两个参数的理解的更多相关文章

  1. django 自定义过滤器中的坑.

    今天在创建自定义过滤器的时候,设置已正常.但是在运行后报: 'filter' is not a valid tag library: Template library filter not found ...

  2. django自定义过滤器及模板标签

    创建一个模板库 不管是写自定义标签还是过滤器,第一件要做的事是创建模板库(Django能够导入的基本结构). 创建一个模板库分两步走: 第一,决定模板库应该放在哪个Django应用下. 如果你通过 m ...

  3. Django自定义过滤器及标签

    一.自定义过滤器 1.自定义过滤器文件存放位置 在APP应用下创建名为templatetags(该文件夹名固定)的文件包(包含__init__.py文件) 注意APP必须在setting中注册 即在s ...

  4. python的Web框架,Django自定义过滤器及标签

    代码布局 有的时候框架给的过滤器不够用,需要自定义一些过滤器,所以就需要我们自己来定义一些过滤器等 自定义代码放置的路径 某个app特用(独有)的 - app 目录下的 templatetags文件夹 ...

  5. Django 自定义过滤器

    设定自定义过滤器之前要现在配置文件内把自己项目名在 INSTALLED_APPS 内导入 #已安装的django应用 INSTALLED_APPS = [ 'django.contrib.admin' ...

  6. Django 自定义过滤器和模板标签

    前提:自定义模板标签和过滤器必须位于Django的某个应用中,这个应用可以包含一个templatetags目录, 和models.py views.py 处于同一级目录.若这个templatetags ...

  7. django 自定义过滤器(filter)处理较为复杂的变量的实例

    简述:django 在views中有数据需要通过字典(dict)的方式传递给template,该字典中又包含了字典,而且字典中的键值还是一个对象,在template中处理传递过来的数据的时候,字典不能 ...

  8. Django 自定义 过滤器和模板标签

    代码布局(自定义的代码,放在哪里) 二种方式:1. 某个app特有的 -app 目录下,templatetags 文件夹     ** 必需是这个名称的包(目录中有__init__.py文件) -再到 ...

  9. django自定义过滤器和标签

    1.自定义过滤器和标签的流程: 1.在某个app下创建一个名为templatetags(必需,且包名不可变)的包.假设我们在名为app01的app下创建了一个templatetags的包,并在该包下创 ...

随机推荐

  1. 团队作业4——第一次项目冲刺(Alpha版本)4.28

    团队作业4--第一次项目冲刺(Alpha版本) Day seven: 会议照片 每日站立会议: 项目进展 今天是项目的Alpha敏捷冲刺的第七天,先大概整理下昨天已完成的任务以及今天计划完成的任务.今 ...

  2. 201521123001《Java程序设计》第2周学习总结

    本周学习总结 码云可以很方便地储存我们写好的代码,不用在写代码的时候担心没带U盘 Java中有许多已经写好的具有特定功能的一段独立小程序,不需要每一个函数都自己编写 Java的float型和C语言的不 ...

  3. 201521123079 《Java程序设计》第1周学习总结

    1. 本周学习总结 了解学习了JAVA的开发环境的基础内容以及JDK,JRE等,学会用eclipse编写简单的代码 2. 书面作业 Q1.为什么java程序可以跨平台运行?执行java程序的步骤是什么 ...

  4. 201521123100 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  5. 201521123121 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 1.两类传输协议:TCP:UDP TCP/IP协议的名称中只有TCP这个协议名,但是在TCP/IP的传输层 ...

  6. 201521123081《Java程序设计》 第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 参考资料:XMind 2. 书面作业 本次PTA作业题集异常.多线程. Q1. finally 题目4-2 ...

  7. JavaScript随笔

    文档模式 主要模式2中混杂模式和标准模式. 1混杂模式,混杂模式会让IE的行为与(包含非标准特性的)IE5相同. 2标准模式,标准模式让IE的行为更接近标准行为. 准标准模式:通过过渡型或框架集型触发 ...

  8. sqlserver2012安装过程

    第三次安装sqlserver2012 记录下安装过程,受益的人多多指教. 一.以我的系统64位为例,所以先准备安装包,从官网 https://www.microsoft.com/zh-CN/downl ...

  9. 数据库Mysql的安装及操作---数据引擎

    一.1.什么是数据           描述事物的符号记录称为数据.       2.什么是数据库         存放数据的仓库,只不过这个仓库在计算机上存储设备上. 二.Mysql的介绍     ...

  10. 用户登陆注册【JDBC版】

    前言 在讲解Web开发模式的时候,曾经写过XML版的用户登陆注册案例!现在在原有的项目上,使用数据库版来完成用户的登陆注册!如果不了解的朋友,可以看看我Web开发模式的博文! 本来使用的是XML文件作 ...