当我希望它在Flask/jinja2中显示为html时,文本被转义

ari*_*nte 23 python jinja2 flask

我从rss中提取一个feed并将数据存储在appengine db中.rss feed内容包括整个html.所以我有这个python代码:

@app.route("/rssRead")
def pullRss():
    feedItem = db.getFeedItemByName(request.args.get('title',None), request.args.get('key',None))
    return render_template("rss.html", data= Markup(feedItem.html).unescape())
Run Code Online (Sandbox Code Playgroud)

我的html模板看起来像这样:

{% extends "layout.html" %}
{% block body %}
{{ data }}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

因此,当我查看页面时,我显示了实际的html标记,如何取消html数据?

Phi*_*ham 100

这应该也有效.

{% extends "layout.html" %}
{% block body %}
{{ data|safe }}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

  • 只是说谢谢,这个"安全"部分就像魔术一样,简单而且棒极了!:) (3认同)
  • 它产生所需的输出,但它也在 python 代码中隐藏了不必要的 unescape() 调用,使 python 代码处于无法正确表示它传递给 Jinja 的内容的状态,将知道这一点的责任推给了模板维护者`data` 包含标记,即使它没有这样表示,并且用不必要的 `|safe` 调用使模板混乱。不太理想。 (2认同)

ʇsә*_*ɹoɈ 12

你应该使用data=Markup(feedItem.html)而不是data=Markup(feedItem.html).unescape().这将做正确的事情并保持模板清洁.

在这里调用unescape()是没有意义的(除非feeditem.html包含预先转义的html,它可能没有).更重要的是,它通过生成字符串/ unicode对象而不是Markup对象来干扰Jinja2识别该字段为需要转义的html的能力.你有效地抛弃了Jinja2自动处理转义的能力(这就是Markup类的目的!)而是强迫你的未来模板维护者记住这个字段需要手动转义并且通过额外的调用来混淆模板代码.