如何通过flask消息显示html内容?

时间:2013-08-14 07:33:08

标签: python flask

我知道flash()只接受字符串并在重定向的页面中显示。 我试图通过flash发送html

message = "<h1>Voila! Platform is ready to used</h1>"
flash(message)
return render_template('output.html')

output.html

<div class="flashes">
  {% for message in get_flashed_messages()%}
    {{ message }}
  {% endfor %}
</div>

但它显示为字符串<h1>Voila! Platform is ready to used</h1>是否有任何方法可以克服这个问题。

4 个答案:

答案 0 :(得分:32)

使用{{message|safe}}将起作用,但也为攻击者向您的页面注入恶意HTML或Javascript打开了大门,也称为XSS攻击。如果您有兴趣,可以访问更多信息here

如果可能,更安全的方法是wrap your string in a Markup object before passing it to the template:

Python代码:

from flask import Markup

message = Markup("<h1>Voila! Platform is ready to used</h1>")
flash(message)
return render_template('output.html')

Jinja2模板:

<div class="flashes">
  {% for message in get_flashed_messages() %}
    {{ message }}
  {% endfor %}
</div>

答案 1 :(得分:9)

使用safe filter

<div class="flashes">
  {% for message in get_flashed_messages()%}
    {{ message|safe }}
  {% endfor %}
</div>

答案 2 :(得分:1)

根据消息状态(成功|错误),您可能希望控制应用的css,以下代码可能有用

{% for category, msg in get_flashed_messages(with_categories=true) %}

    <div class="alert {{ category }} alert-dismissible" role="alert">
                            <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
                           {{ msg|safe }}
    </div>

{%endfor%}

答案 3 :(得分:0)

另一种方法是调用render_template到外部HTML文件并将其传递给Markup类。

main / routes.py

from flask import render_template, flash, Markup
from . import blueprint

@blueprint.route("/user")
def user():
    flash(Markup(render_template("templates/user.html", name="John Doe"))
    return render_template("templates/home.html")

templates / user.html

<h1>User: {{ name }}</h1>