功能
flask通过flash message给用户反馈。flash message在请求结束时记录信息并在下一个(且仅在下一个)请求中访问。通常结合模板布局来显示消息。
使用方式
- 定义一个
flash message - 获取
flash message
完整示例:
from flask import Flask, render_template, flash, request, redirect, url_forapp = Flask(__name__)app.secret_key= b'9\xd5\xf8\xf2\x95\x19\x1a\xd2i0\xb71\xcfh\xcb\xe1E\x07\xbaT\t\xc6]#'@app.route('/index', endpoint='index')@app.route('/')def hello_world():return render_template('index.html')@app.route('/login/', methods=['GET', 'POST'], endpoint='login')def login():error = Noneif request.method == 'POST':if request.form['username'] != 'admin' or request.form['password'] != 'secret':error = 'Invalid credentials'else:# 1. 定义flash, 注意:仅可以在下一个请求中访问flash('You were successfully logged in')return redirect(url_for('index'))return render_template('login.html', error=error)if __name__ == '__main__':app.run()
在base.html 模板中获取 flash
<!doctype html><title>My Application</title>{% with messages = get_flashed_messages() %} {# 2. 获取 flash #}{% if messages %}<ul class=flashes>{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>{% endif %}{% endwith %}{% block body %}{% endblock %}
模板扩展使用方法,以下是index.html模板
{% extends 'base.html' %}{% block body %}<p>welcome to my homepage</p><a href="{{ url_for('login') }}">login</a>{% endblock %}
login 模板
{% extends "base.html" %}{% block body %}<h1>Login</h1>{% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}<form action="" method=post><dl><dt>Username:<dd><input type=text name=username value="{{ request.form.username }}"><dt>Password:<dd><input type=password name=password></dl><p><input type=submit value=Login></form>{% endblock %}
flash类别
flash可以指定类别,默认为message。不同的类别可以给用户提供更好的反馈。例如错误消息可以使用红色背景。
flash('Invalid pasword provided', 'error')
模板中的 get_flashed_messages() 函数也应当返回类别,显示消息的循环也要略作改变:
{% with messages = get_flashed_messages(with_categories=true) %}{% if messages %}<ul class=flashes>{% for category, message in messages %}<li class="{{ category }}">{{ message }}</li>{% endfor %}</ul>{% endif %}{% endwith %}
过滤flash消息
你可以视情况通过传递一个类别列表来过滤 get_flashed_messages()的结果。这个功能有助于在不同位置显示不同类型的消息。
{% with errors = get_flashed_messages(category_filter=["error"]) %}{% if errors %}<div class="alert-message block-message error"><a class="close" href="#">×</a><ul>{%- for msg in errors %}<li>{{ msg }}</li>{% endfor -%}</ul></div>{% endif %}{% endwith %}
