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


当前回答

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

如果你只想在字符串中插入一些换行符,并将换行符转换为<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 %}

在模板中调用with

{{ linebreaks_for_string( my_string_in_a_variable ) }}

其他回答

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

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

MarkupSafe提供了Jinja的自动转义行为。您可以导入Markup并使用它从代码中声明一个HTML安全值:

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

把它传递给模板,你不必对它使用|安全过滤器。

若要在呈现值时关闭自动转义,请使用|安全过滤器。

{{ something|safe }}

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

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

如果你只想在字符串中插入一些换行符,并将换行符转换为<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 %}

在模板中调用with

{{ linebreaks_for_string( my_string_in_a_variable ) }}

从Jinja文档部分HTML转义:

当启用自动转义时,默认情况下所有内容都会被转义 除了显式标记为安全的值。它们可以是 由应用程序或模板中使用|保险箱标记 过滤器。

例子:

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