Jinja2逃脱所有HTML但img,b等

sas*_*hab 14 python escaping jinja2 flask

Jinja2的自动转义所有的HTML标签,但我想摆脱不了一些标签(比如img,b和其他一些).我该怎么做?

Ale*_*ega 11

您可以编写自己的过滤器.该洗涤器是在清理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
Run Code Online (Sandbox Code Playgroud)


Sea*_*ira 11

您将要使用白名单方法解析提交时的输入 - 此问题中有几个很好的示例和可行的选项.

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

{{comment|safe}}
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 7

漂白库可以做的非常好.

例如,假设变量'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
Run Code Online (Sandbox Code Playgroud)

然后在模板中你可能会有类似的东西:

<p>{{ my_variable|clean(tags=['img', 'b', 'i', 'em', 'strong'], attributes={'img': ['src', 'alt', 'title', 'width', 'height']}) }}</p>
Run Code Online (Sandbox Code Playgroud)

您还可以在属性中使用可调用(而不是列表),从而允许对属性进行更彻底的验证(例如,检查src是否提供了有效的URL).文档显示了一个示例.