如何防止Django模板中的自动转义?

14 投票
2 回答
13752 浏览
提问于 2025-04-17 09:46

在文档中提到:

唯一的例外是那些已经被标记为“安全”的变量,这些变量要么是由填充变量的代码标记的,要么是因为它们应用了安全或转义过滤器。

这里提到的“填充变量”是怎么回事呢?我其实想找一种方法,在视图中把一个模板标签声明为安全。我觉得让设计师来决定这件事不是个好主意。我的同事可能会在她“觉得”合适的时候就加上去。

https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs

2 个回答

6

你可以使用 django.utils.safestring.mark_safe 这个函数,并把你的变量传进去。

...
return direct_to_template('my-template.html', {'safe_var': mark_safe('<script>alert("");</script>')})

这样在模板中打印出来的时候,就不会被转义了(会弹出警告框)。不过,自动转义其实是个很棒的功能,可以帮你避免一些麻烦的事情。

25

Django 有一种特殊的字符串叫做 安全字符串(具体来说是 SafeUnicodeSafeString),你可以通过 django.utils.safestring.mark_safe 来创建它。当模板引擎遇到安全字符串时,它不会对这个字符串进行 HTML 转义处理:

>>> from django.utils.safestring import mark_safe
>>> from django.template import Template, Context
>>> Template("{{ name }}").render(Context({'name': mark_safe('<b>Brad</b>')}))
u"<b>Brad</b>"

如果你在写自己的模板标签,你需要实现一个叫 render() 的方法,这个方法会返回一个被视为安全的字符串,这意味着你需要自己处理任何需要转义的内容。不过,如果你在写一个模板过滤器,你可以在过滤器上设置一个属性 is_safe = True,这样返回的值就不会自动转义了,例如:

@register.filter
def myfilter(value):
    return value
myfilter.is_safe = True

想了解更多细节,可以查看 这个链接

撰写回答