Jinja2逃脱所有HTML但img,b等

时间:2012-01-23 18:28:30

标签: python escaping flask jinja2

Jinja2会自动转义所有HTML标记,但我不想转义某些标记(例如imgb和其他标记)。我该怎么办?

3 个答案:

答案 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 questionviable 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