我正在为Flask和SQLAlchemy构建一个管理,我想通过使用render_template将不同输入的HTML传递给我的视图。模板框架似乎自动转义HTML,因此所有<"'>字符都转换为HTML实体。我如何禁用它,以使HTML正确呈现?
当前回答
若要在呈现值时关闭自动转义,请使用|安全过滤器。
{{ something|safe }}
只对您信任的数据执行此操作,因为呈现不受信任的数据而不转义是跨站点脚本漏洞。
其他回答
从Jinja文档部分HTML转义:
当启用自动转义时,默认情况下所有内容都会被转义 除了显式标记为安全的值。它们可以是 由应用程序或模板中使用|保险箱标记 过滤器。
例子:
<div class="info">
{{data.email_content|safe}}
</div>
若要在呈现值时关闭自动转义,请使用|安全过滤器。
{{ 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 ) }}
为了特别处理换行符,我尝试了许多选项,最后选择了这个:
{% set list1 = data.split('\n') %}
{% for item in list1 %}
{{ item }}
{% if not loop.last %}
<br/>
{% endif %}
{% endfor %}
这种方法的优点是它与自动转义兼容,使一切都保持良好和安全。它还可以与过滤器结合使用,比如urlize。
当然,这与Helge的答案相似,但不需要宏(而是依赖于Jinja内置的split函数),也没有在最后一项后添加不必要的<br/>。
在模板中使用安全过滤器,然后在视图中使用bleach库对HTML进行消毒。使用漂白剂,您可以将需要使用的HTML标记列入白名单。
据我所知,这是最安全的。我尝试了安全过滤器和Markup类,这两种方法都允许我执行不需要的JavaScript。不太安全!
推荐文章
- 如何在交互式Python中查看整个命令历史?
- 如何显示有两个小数点后的浮点数?
- 如何用OpenCV2.0和Python2.6调整图像大小
- 在每个列表元素上调用int()函数?
- 当使用代码存储库时,如何引用资源的相对路径
- 如何在Flask-SQLAlchemy中按id删除记录
- 在Python中插入列表的第一个位置
- Python Pandas只合并某些列
- 如何在一行中连接两个集而不使用“|”
- 从字符串中移除前缀
- 代码结束时发出警报
- 如何在Python中按字母顺序排序字符串中的字母
- 在matplotlib中将y轴标签添加到次要y轴
- 如何消除数独方块的凹凸缺陷?
- 为什么出现这个UnboundLocalError(闭包)?