Jinja2逃脱所有HTML但img,b等

问题描述 投票:14回答:3

Jinja2自动转义所有HTML标签,但我想不要逃避一些标签(如imgb和其他一些标签)。我该怎么做?

python escaping flask jinja2
3个回答
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

11
投票

您将要使用白名单方法解析提交时的输入 - 有几个很好的例子in this questionviable options

完成后,您可以标记任何包含不应使用safe过滤器转义的HTML的变量:

{{comment|safe}}

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

© www.soinside.com 2019 - 2024. All rights reserved.