在Flask/jinja2中,文本被转义,无法显示为HTML

33 投票
2 回答
32912 浏览
提问于 2025-04-16 15:13

我从RSS源获取数据,并把这些数据存储在一个App Engine的数据库里。这个RSS源的内容包含了完整的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())

我的HTML模板是这样的:

{% extends "layout.html" %}
{% block body %}
{{ data }}
{% endblock %}

但是当我查看页面时,实际的HTML标记被直接显示出来了,我该怎么处理才能让这些HTML数据正常显示,而不是原样显示代码呢?

2 个回答

115

这个也应该可以用。

{% extends "layout.html" %}
{% block body %}
{{ data|safe }}
{% endblock %}
16

与其使用 data=Markup(feedItem.html).unescape(),不如直接用 data=Markup(feedItem.html)。这样做更合适,也能让你的模板保持干净整洁。

在这里调用 unescape() 是没有必要的(除非 feedItem.html 里包含了已经转义过的 HTML,但这通常不会发生)。更重要的是,使用 unescape() 会生成一个字符串或 Unicode 对象,而不是 Markup 对象,这样 Jinja2 就无法识别这个字段包含需要转义的 HTML。这会影响 Jinja2 自动转义的功能(这正是 Markup 类的作用!)。而且,这样还会让将来维护模板的人记得这个字段需要手动转义,这样会让模板代码变得更加复杂。

撰写回答