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


163

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

Answers:


343

理想的方法是

{{ something|safe }}

而不是完全关闭自动转义。


2
嗨,@ Armin Ronacher,您能再说明一下并举个例子吗?谢谢。
Samoth '17

我的意思是,例如,我有一个名为的文件userHome.html,并且我想使用return render_template('userHome.html'),但它无法正确呈现,并且在chrome控制台中全部转为html实体
萨莫斯(Samoth)'17

trans标记中,这必须用作{% trans something=something|safe %}A {{something}} B{% endtrans %}
Kangur

1
值得一提的是,在执行此操作时,应小心避免跨站点脚本漏洞,因为您正在禁用模板库的内置保护措施。
哈里·卡茨

108

您还可以从代码中将其声明为HTML安全的:

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

然后将该值传递给模板,而他们不必这样做|safe


4
标记是Jinja2类,是的。它实现了许多python库(不幸的是Django)所支持的通用接口。您还可以使用实现相同对象的标记安全包:pypi.python.org/pypi/MarkupSafe
Armin Ronacher,2010年

它存在于jinja2
Giovanni G. PY19年

23

从jinja docs部分HTML Escaping

启用自动转义后,默认情况下所有内容都将转义,除非明确标记为安全的值。可以通过应用程序或使用安全过滤器在模板中对其进行标记。

例:

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

5

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

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

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 ) }}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.