使用 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,这会带来安全风险来操纵字符串显示。
如果您只想在字符串中插入一些换行符并将换行符转换为<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 )
【讨论】:
【参考方案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
函数),也不会在最后一项之后添加不必要的 <br/>
。
【讨论】:
以上是关于使用 Flask/Jinja2 将 HTML 传递给模板的主要内容,如果未能解决你的问题,请参考以下文章