繁体   English   中英

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

[英]Passing HTML to template using Flask/Jinja2

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

要在渲染值时关闭自动转义,请使用|safe过滤器。

{{ something|safe }}

仅对您信任的数据执行此操作,因为在不转义的情况下呈现不受信任的数据是一种跨站点脚本漏洞。

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

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

将其传递给模板,您不必在其上使用|safe过滤器。

从 Jinja 文档部分HTML 转义

当启用自动转义时,默认情况下所有内容都会被转义,但明确标记为安全的值除外。 这些可以由应用程序标记,也可以使用|safe过滤器在模板中标记。

例子:

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

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

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

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

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

在模板中使用safe过滤器,然后在视图中使用bleach清理 HTML。 使用漂白剂,您可以将需要使用的 HTML 标签列入白名单。

据我所知,这是最安全的。 我尝试了safe过滤器和Markup类,这两种方法都允许我执行不需要的 JavaScript。 不是很安全!

为了专门处理换行符,我在最终解决此问题之前尝试了许多选项:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM