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

Posted

技术标签:

【中文标题】使用 Flask/Jinja2 将 HTML 传递给模板【英文标题】:Passing HTML to template using Flask/Jinja2 【发布时间】:2011-03-13 11:46:02 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

 something|safe 

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

来自 Jinja 文档部分 HTML Escaping

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

例子:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

如果您只想在字符串中插入一些换行符并将换行符转换为&lt;br /&gt;,那么您可以采用 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 ) 

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

为了专门处理换行符,我尝试了许多选项,然后最终解决了这个问题:

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

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

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

【讨论】:

以上是关于使用 Flask/Jinja2 将 HTML 传递给模板的主要内容,如果未能解决你的问题,请参考以下文章

??????Pythonweb - flask+jinja2

Flask jinja2 检索下拉列表的值

Flask Jinja2开发中遇到的的服务端注入问题研究

flask jinja2模板引擎

flask jinja2模块怎样引入css文件

flask jinja2怎么给textarea 赋值