我知道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>
是否有任何方法可以克服这个问题。
答案 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>