web-dev-qa-db-ja.com

Flask / jinja2にhtmlとして表示したいときにテキストがエスケープされました

Rssからフィードを取得し、データをappengineデータベースに保存します。 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データをエスケープ解除するにはどうすればよいですか?

23
arinte

data=Markup(feedItem.html)の代わりにdata=Markup(feedItem.html).unescape()を使用する必要があります。それは正しいことをし、あなたのテンプレートをきれいに保ちます。

ここでunescape()を呼び出すことは無意味です(feeditem.htmlに事前にエスケープされたhtmlが含まれている場合を除きますが、おそらく含まれていません)。さらに重要なことに、マークアップオブジェクトの代わりに文字列/ユニコードオブジェクトを生成することにより、エスケープが必要なhtmlとしてフィールドを認識するJinja2の機能を妨害します。エスケープを自動的に処理するJinja2の機能を効果的に破棄し(これがMarkupクラスの目的です!)、代わりに、将来のテンプレートメンテナに、このフィールドには手動でのエスケープが必要であることを覚えてもらい、追加の呼び出しでテンプレートコードを乱雑にする必要があります。 。

12
ʇsәɹoɈ

これも機能するはずです。

{% extends "layout.html" %}
{% block body %}
{{ data|safe }}
{% endblock %}
101
Philip Southam