本文例子的源码:https://github.com/SingleDiego/flask-Flash
Flask 提供了一个非常简单的方法来使用闪现系统(Flash)向用户反馈信息。闪现系统使得在一个请求结束的时候记录一个信息,然后在且仅仅在下一个请求中访问这个数据。这通常配合一个布局模板实现。
我们在这里用一个小 Demo 来说明,这里我们做一个模拟的登陆界面,当密码和用户名匹配时,反馈“你已登录成功”,不匹配时,反馈“登录失败”。
编写 app.py
:
from flask import (
Flask,
flash, # 消息闪现
redirect,
render_template,
request, url_for
)
app = Flask(__name__)
app.secret_key = 'some_secret'
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
# 以下代码模拟登陆功能
if request.method == 'POST':
# 登录失败
if request.form['username'] != 'admin' or \
request.form['password'] != '123456':
error = '登录失败!'
# 登陆成功
else:
# 消息闪现功能,现在可以在 index 页面读取到反馈的信息
flash('你已成功登录!')
return redirect(url_for('index'))
return render_template('login.html', error=error)
if __name__ == "__main__":
app.run()
编写继承模板 layout.html
:
<!doctype html>
<!-- 这里是基础模板,等下 login 和 index 都会继承本模板 -->
<title>My Application</title>
<!-- 获取到反馈的消息 -->
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class=flashes>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block body %}
{% endblock %}
我们让 index.html
和 login.html
继承上面的继承模板。
编写 index.html
:
<!-- 继承 layout 模板 -->
{% extends "layout.html" %}
<!-- 替换模板做的 block body 部分 -->
{% block body %}
<h1>Overview</h1>
<p><a href="{{ url_for('login') }}">登录</a>
{% endblock %}
编写 login.html
:
<!-- 继承 layout 模板 -->
{% extends "layout.html" %}
<!-- 替换模板做的 block body 部分 -->
{% block body %}
<h1>Login</h1>
<!-- 如果有错误信息 -->
{% if error %}
<p class=error><strong>Error:</strong> {{ error }}
{% endif %}
<form action="" method=post>
<dl>
<dt>用户名:<dd>
<input type=text name=username value="{{request.form.username }}">
<dt>密码:<dd>
<input type=password name=password>
</dl>
<input type=submit value=Login>
</form>
{% endblock %}
登陆成功后的界面:
分类闪现
当闪现一个消息时,是可以提供一个分类的。未指定分类时默认的分类为 'message' 。
要使用一个自定义的分类,只要使用 flash()
函数的第二个参数:
flash(u'登录失败!', 'error')
在模板中,您接下来可以调用 get_flashed_messages(with_categories=true)
函数来返回这个分类。
下面来修改一下上例。
编写 app.py
:
from flask import (
Flask,
flash, # 消息闪现
redirect,
render_template,
request, url_for
)
app = Flask(__name__)
app.secret_key = 'some_secret'
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
# 以下代码模拟登陆功能
if request.method == 'POST':
# 登录失败
if request.form['username'] != 'admin' or \
request.form['password'] != '123456':
# 在闪现的消息中带上分类 'error'
flash(u'登录失败!', 'error')
# 登陆成功
else:
# 消息闪现功能,现在可以在 index 页面读取到反馈的信息
flash(u'你已成功登录!')
return redirect(url_for('index'))
return render_template('login.html')
if __name__ == "__main__":
app.run()
编写 layout.html
:
<!doctype html>
<!-- 这里是基础模板,等下 login 和 index 都会继承本模板 -->
<title>My Application</title>
<!-- 获取到反馈的消息,并带上自定义分类 -->
{% 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 %}
{% block body %}
{% endblock %}
过滤闪现消息
我们可以将一个分类的列表传入到 get_flashed_messages()
中, 以过滤函数返回的结果。
过滤器我们这样使用:
get_flashed_messages(with_categories=true, category_filter=["error"])
看一个完整的例子,改写下 layout.html
:
<!doctype html>
<!-- 这里是基础模板,等下 login 和 index 都会继承本模板 -->
<title>My Application</title>
<!-- 获取到反馈的消息,并带上自定义分类 -->
{% with messages = get_flashed_messages(with_categories=true, category_filter=["message"]) %}
{% if messages %}
<ul class=flashes>
{% for category, message in messages %}
<li class="messages">{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<!-- 这里我们加上过滤器,只接受 error 类型的消息 -->
<!-- 这样做能方便地把不同类型的消息用不同的模板来处理 -->
{% with errors = get_flashed_messages(with_categories=true, 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 %}
{% block body %}
{% endblock %}
网友评论