自定义template过滤器的方法,不再赘述
is_safe
文档说明过滤的两种最终形态,其中一种是设置register.filter(is_safe=True)
,但是对is_safe的具体作用说的云山雾绕的,而查了些博文只是简单的说is_safe可以关闭掉自动转义(这个说法是错误的!)
@register.filterdef demo(value): return '' + value@register.filter(is_safe=True)def demo(value): return '' + value
结果就是都对过滤器返回的结果进行了转义!
后来发现重点在于文档中的这一句话: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的过滤器在完成之后会修复这种破坏,并且很困难'.
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 '' + value
这样的情况,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 = '%s%s' % (esc(first), esc(other)) return mark_safe(result)
该过滤器的输出通过mark_safe()
函数标记为"安全",这样可以保证在过滤器中引入的HTML标签可以实现.但是同样要考虑输入的安全问题.如果模板中autoescape
是开启的,说明我们已经认定这部分的数据是存在威胁的,所以需要在过滤器中手动对输入数据进行转义来保证其安全性.