问题:使用Flask / Jinja2将HTML传递到模板
我正在为Flask和SQLAlchemy构建一个管理员,我想使用来将不同输入的HTML传递给我的视图render_template
。模板框架似乎会自动转义html,因此所有<“’>都将转换为html实体。如何禁用它以使HTML正确呈现?
回答 0
理想的方法是
{{ something|safe }}
而不是完全关闭自动转义。
回答 1
您还可以从代码中将其声明为HTML安全的:
from flask import Markup
value = Markup('<strong>The HTML String</strong>')
然后将该值传递给模板,而他们不必这样做|safe
。
回答 2
从jinja docs部分HTML Escaping:
启用自动转义后,默认情况下所有内容都将转义,除非明确标记为安全的值。可以通过应用程序或使用安全过滤器在模板中对其进行标记。
例:
<div class="info">
{{data.email_content|safe}}
</div>
回答 3
当您有很多不需要转义的变量时,可以使用一个autoescape
块:
{% autoescape off %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}
回答 4
有些人似乎关闭了自动转义功能,这会带来安全风险,可能会影响字符串显示。
如果您只想在字符串中插入一些换行符并将其转换为<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 ) }}