我正在为Flask和SQLAlchemy构建一个管理,我想通过使用render_template将不同输入的HTML传递给我的视图。模板框架似乎自动转义HTML,因此所有<"'>字符都转换为HTML实体。我如何禁用它,以使HTML正确呈现?
当前回答
若要在呈现值时关闭自动转义,请使用|安全过滤器。
{{ 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 ) }}
当你有很多不需要转义的变量时,你可以使用autoescape重写块:
{% autoescape false %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}
为了特别处理换行符,我尝试了许多选项,最后选择了这个:
{% set list1 = data.split('\n') %}
{% for item in list1 %}
{{ item }}
{% if not loop.last %}
<br/>
{% endif %}
{% endfor %}
这种方法的优点是它与自动转义兼容,使一切都保持良好和安全。它还可以与过滤器结合使用,比如urlize。
当然,这与Helge的答案相似,但不需要宏(而是依赖于Jinja内置的split函数),也没有在最后一项后添加不必要的<br/>。
若要在呈现值时关闭自动转义,请使用|安全过滤器。
{{ something|safe }}
只对您信任的数据执行此操作,因为呈现不受信任的数据而不转义是跨站点脚本漏洞。
MarkupSafe提供了Jinja的自动转义行为。您可以导入Markup并使用它从代码中声明一个HTML安全值:
from markupsafe import Markup
value = Markup('<strong>The HTML String</strong>')
把它传递给模板,你不必对它使用|安全过滤器。
推荐文章
- 有没有办法在python中做HTTP PUT
- “foo Is None”和“foo == None”之间有什么区别吗?
- 类没有对象成员
- Django模型“没有显式声明app_label”
- 熊猫能自动从CSV文件中读取日期吗?
- 在python中zip的逆函数是什么?
- 有效的方法应用多个过滤器的熊猫数据框架或系列
- 如何检索插入id后插入行在SQLite使用Python?
- 我如何在Django中添加一个CharField占位符?
- 如何在Python中获取当前执行文件的路径?
- 我如何得到“id”后插入到MySQL数据库与Python?
- super()失败,错误:TypeError "参数1必须是类型,而不是classobj"当父不继承对象
- Python内存泄漏
- 实现嵌套字典的最佳方法是什么?
- 如何在tensorflow中获得当前可用的gpu ?