为什么要使用is_safe?
我在看Django的文档,特别是关于自定义过滤器的部分。
但是,我不明白为什么会有一个叫is_safe的东西。
我写了一些例子,然后试了一下,不管is_safe是设置为True还是False,结果都是一样的。
那is_safe到底有什么用呢?
这是我的代码
extra_tags.py
from django.template.defaultfilters import stringfilter
from django import template
import datetime
register = template.Library()
@register.filter(name='custom_lower')
@stringfilter
def lower(value):
is_safe = True
return '%sxx'%value
lower.is_safe = True;
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe
@register.filter(name='custom_lf')
def initial_letter_filter(text, autoescape=None):
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)
initial_letter_filter.is_safe = False
initial_letter_filter.needs_autoescape = True
我的意思是,不管我把is_safe设置为True还是False,结果都是自动转义的字符。我就是搞不懂为什么要用is_safe。
1 个回答
11
使用 is_safe
和 mark_safe()
一起是多余的,这可能就是你看不到任何区别的原因。
正如你提到的那部分内容中所说的,在谈到 mark_safe()
的地方:
在这种情况下,不用担心
is_safe
属性(虽然加上它也没什么坏处)。每当你手动处理自动转义的问题并返回一个安全的字符串时,is_safe
属性无论如何都不会改变任何东西。
is_safe
只是一个自动标记函数返回值为安全的方式,前提是所有外部输入都是安全的。Django 仍然会对任何输入进行自动转义,但它不会尝试转义你函数之后添加的其他部分。
而 mark_safe()
则是确认输出是安全的,无论输入是否安全 - 如果你要使用它,这是一种更严格的要求。