功能
flask通过flash message
给用户反馈。flash message
在请求结束时记录信息并在下一个(且仅在下一个)请求中访问。通常结合模板布局来显示消息。
使用方式
- 定义一个
flash message
- 获取
flash message
完整示例:
from flask import Flask, render_template, flash, request, redirect, url_for
app = 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 = None
if 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 %}