【问题标题】:Jinja2 escape all HTML but img, b, etcJinja2 转义除 img、b 等之外的所有 HTML
【发布时间】:2012-02-17 02:24:51
【问题描述】:

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

【问题讨论】:

    标签: python escaping flask jinja2


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      您可以编写自己的过滤器。 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
      

      【讨论】:

      • scrubber 库未维护,不支持python3
      【解决方案3】:

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

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

      {{comment|safe}}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多