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

时间:2010-07-08 17:34:37

标签: python jinja2 flask

我正在为Flask和SQLAlchemy构建管理员,我想使用render_template将不同输入的HTML传递给我的视图。模板框架似乎自动转义html,因此所有<“'>都转换为html实体。如何禁用它以便HTML呈现正确?

6 个答案:

答案 0 :(得分:260)

理想的方式是

{{ something|safe }}

比完全关闭自动转义。

答案 1 :(得分:90)

您还可以从代码中声明HTML安全:

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

然后将该值传递给模板,他们没有|safe它。

答案 2 :(得分:14)

来自jinja docs部分HTML Escaping

  

启用自动转义功能后,默认情况下会转义所有内容   除了明确标记为安全的值。那些可以是   由应用程序标记或在模板中使用| safe   过滤

示例:

 <div class="info">
   {{data.email_content|safe}}
 </div>

答案 3 :(得分:1)

有些人似乎关闭了自动转义,这会带来安全风险来操纵字符串显示。

如果您只想在字符串中插入一些换行符并将换行符转换为<br />,则可以使用 jinja宏,例如:

{% 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 ) }}

答案 4 :(得分:0)

当您有很多不需要转义的变量时,可以使用autoescape块:

{% autoescape off %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}

答案 5 :(得分:-1)

为了专门处理换行符,我尝试了许多选项,然后最终解决了这个问题:

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

这种方法的好处是它与自动转义兼容,让一切变得美好而安全。它还可以与过滤器结合使用,例如 urlize。

当然它类似于 Helge 的答案,但不需要宏(而是依靠 Jinja 的内置 split 函数)并且也不会在最后一项之后添加不必要的 <br/> .