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