Jinja2会自动转义所有HTML标记,但我不想转义某些标记(例如img
,b
和其他标记)。我该怎么办?
答案 0 :(得分:11)
您可以编写自己的过滤器。 scrubber library非常擅长清理HTML。过滤器需要将返回的字符串包装在jinja2.Markup
中,这样模板就不会重新转义它。
编辑:代码示例
import jinja2
import scrubber
def sanitize_html(text):
return jinja2.Markup(scrubber.Scrubber().scrub(text))
jinja_env.filters['sanitize_html'] = sanitize_html
答案 1 :(得分:11)
您需要使用白名单方法解析提交时的输入 - 有几个很好的示例in this question和viable options。
完成后,您可以标记任何包含不应使用safe
过滤器转义的HTML的变量:
{{comment|safe}}
答案 2 :(得分:7)
Bleach库可以做得很好。
例如,假设变量'jinja_env'在范围内:
from bleach import clean
from markupsafe import Markup
def do_clean(text, **kw):
"""Perform clean and return a Markup object to mark the string as safe.
This prevents Jinja from re-escaping the result."""
return Markup(clean(text, **kw))
jinja_env.filters['clean'] = do_clean
然后在模板中你可能会有:
<p>{{ my_variable|clean(tags=['img', 'b', 'i', 'em', 'strong'], attributes={'img': ['src', 'alt', 'title', 'width', 'height']}) }}</p>
您还可以在属性中使用可调用(而不是列表),从而允许对属性进行更彻底的验证(例如,检查src是否提供了有效的URL)。文档显示an example。