为什么要使用is_safe?

4 投票
1 回答
1993 浏览
提问于 2025-04-17 03:44

我在看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_safemark_safe() 一起是多余的,这可能就是你看不到任何区别的原因。

正如你提到的那部分内容中所说的,在谈到 mark_safe() 的地方:

在这种情况下,不用担心 is_safe 属性(虽然加上它也没什么坏处)。每当你手动处理自动转义的问题并返回一个安全的字符串时,is_safe 属性无论如何都不会改变任何东西。

is_safe 只是一个自动标记函数返回值为安全的方式,前提是所有外部输入都是安全的。Django 仍然会对任何输入进行自动转义,但它不会尝试转义你函数之后添加的其他部分。

mark_safe() 则是确认输出是安全的,无论输入是否安全 - 如果你要使用它,这是一种更严格的要求。

撰写回答