【问题标题】:Text escaped when I want it to show up as html in Flask/jinja2当我希望文本在 Flask/jinja2 中显示为 html 时,文本已转义
【发布时间】:2011-07-31 03:25:55
【问题描述】:

我从 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 数据?

【问题讨论】:

    标签: python jinja2 flask


    【解决方案1】:

    您应该使用data=Markup(feedItem.html),而不是data=Markup(feedItem.html).unescape()。这将做正确的事情并保持您的模板干净。

    在这里调用 unescape() 是没有意义的(除非 feeditem.html 包含预转义的 html,它可能不包含)。更重要的是,在这里使用 unescape() 会生成一个字符串/unicode 对象而不是 Markup 对象,这使 Jinja2 无法识别该字段包含需要转义的 html。这破坏了 Jinja2 的自动转义能力(这就是 Markup 类的目的!)我还迫使您未来的模板维护者记住该字段需要手动转义,这会使模板代码因额外的调用而混乱。

    【讨论】:

      【解决方案2】:

      这应该也可以。

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

      【讨论】:

      • 只是说谢谢,这个“|安全”部分就像魔术一样,简单而棒! :)
      • 它产生所需的输出,但它也在 python 代码中隐藏了不必要的 unescape() 调用,使 python 代码处于无法正确表示它传递给 Jinja 的状态,推动模板维护者有责任知道data 包含标记,即使它没有这样表示,并且用不必要的|safe 调用使模板混乱。不太理想。
      • 这个答案更加多元——在 Django 上有同样的问题,这解决了它。
      • 创可贴也是多价的,但最好还是不要一开始就割伤自己。
      猜你喜欢
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 2016-09-22
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2023-02-04
      相关资源
      最近更新 更多