代码之家  ›  专栏  ›  技术社区  ›  sharvey

使用Flask/Jinja2将HTML传递到模板

  •  121
  • sharvey  · 技术社区  · 15 年前

    我正在为Flask和SQLAlchemy构建一个管理员,我想使用 render_template . 模板框架似乎自动脱离了HTML,所以 <"'> 字符转换为HTML实体。我怎样才能禁用它以便HTML正确呈现呢?

    3 回复  |  直到 4 年前
        1
  •  413
  •   Mark Amery Harley Holcombe    4 年前

    要在呈现值时关闭自动转义,请使用 |safe

    {{ something|safe }}
    

    仅对信任的数据执行此操作,因为呈现不受信任的数据而不转义是一个跨站点脚本漏洞。

        2
  •  126
  •   davidism    4 年前

    MarkupSafe 提供Jinja的自动转义行为。您可以导入 Markup

    from markupsafe import Markup
    value = Markup('<strong>The HTML String</strong>')
    

    把它传递给模板,你就不必使用 |safe 在上面过滤。

        3
  •  27
  •   Mark Amery Harley Holcombe    4 年前

    来自Jinja文档部分 HTML Escaping :

    但明确标记为安全的值除外。它们可以是 |safe 过滤器。

     <div class="info">
       {{data.email_content|safe}}
     </div>
    
        4
  •  12
  •   Mark Amery Harley Holcombe    4 年前

    autoescape override 块:

    {% autoescape false %}
    {{ something }}
    {{ something_else }}
    <b>{{ something_important }}</b>
    {% endautoescape %}
    
        5
  •  1
  •   pcampana Helge    5 年前

    有些人似乎转向 自动逃逸 带着什么走 操作字符串显示。

    <br /> ,然后你可以 金贾宏 比如:

    {% macro linebreaks_for_string( the_string ) -%}
    {% if the_string %}
    {% for line in the_string.split('\n') %}
    <br />
    {{ line }}
    {% endfor %}
    {% else %}
    {{ the_string }}
    {% endif %}
    {%- endmacro %}
    

    在你的 模板 把这个叫做

    {{ linebreaks_for_string( my_string_in_a_variable ) }}
    
        6
  •  -1
  •   Tom M    4 年前

    具体来说,为了处理换行符,我尝试了很多选择,最后才解决了这个问题:

    {% set list1 = data.split('\n') %}
    {% for item in list1 %}
    {{ item }}
      {% if not loop.last %}
      <br/>
      {% endif %}
    {% endfor %}
    

    这种方法的优点是它与自动转义兼容,使一切都很好和安全。它也可以与过滤器相结合,比如urlize。

    当然,它与Helge的答案类似,但不需要宏(而是依赖于Jinja的内置 split 函数),也不会添加不必要的 <br/>