如何防止Django模板中的自动转义?
在文档中提到:
唯一的例外是那些已经被标记为“安全”的变量,这些变量要么是由填充变量的代码标记的,要么是因为它们应用了安全或转义过滤器。
这里提到的“填充变量”是怎么回事呢?我其实想找一种方法,在视图中把一个模板标签声明为安全。我觉得让设计师来决定这件事不是个好主意。我的同事可能会在她“觉得”合适的时候就加上去。
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 有一种特殊的字符串叫做 安全字符串(具体来说是 SafeUnicode
或 SafeString
),你可以通过 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
想了解更多细节,可以查看 这个链接。