30

我知道flash()这只需要字符串并在重定向页面中显示。我正在尝试通过 Flash 发送 html

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

输出.html

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

但它显示为字符串<h1>Voila! Platform is ready to used</h1>有什么办法可以克服这个问题。

4

4 回答 4

57

在可能的情况下,一种安全的方法是在将字符串传递给模板之前将其包装在标记对象中:

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>

使用{{message|safe}}会起作用,但也会为攻击者打开大门,将恶意 HTML 或 Javascript 注入您的页面,也称为 XSS 攻击。如果您有兴趣,请在此处了解更多信息。

于 2014-01-03T01:29:23.403 回答
8

使用safe过滤器

<div class="flashes">
  {% for message in get_flashed_messages()%}
    {{ message|safe }}
  {% endfor %}
</div>
于 2013-08-14T08:41:30.423 回答
2

对于您可能希望根据消息状态(成功 | 错误)控制应用的 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 %}
于 2015-10-13T22:29:05.663 回答
1

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

主要/路线.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")

模板/user.html

<h1>User: {{ name }}</h1>
于 2019-09-12T04:43:28.347 回答