消息闪现
一个好的应用和用户界面都需要良好的反馈。如果用户得不到足够的反馈,那么应用 最终会被用户唾弃。 Flask
的闪现系统提供了一个良好的反馈方式。闪现系统的基 本工作方式是:在且只在下一个请求中访问上一个请求结束时记录的消息。一般我们
结合布局模板来使用闪现系统。注意,浏览器会限制 cookie 的大小,有时候网络服 务器也会。这样如果消息比会话 cookie
大的话,那么会导致消息闪现静默失败。
---->> 来自官方文档
文档:https://dormousehole.readthedocs.io/en/latest/patterns/flashing.html
一、 在模板中获取闪现信息
Flask
提供了一个非常简单的方法来使用闪现系统向用户反馈信息。闪现系统使得在一个请求结束的时候记录一个信息,然后在且仅仅在下一个请求中访问这个数据
,强调flask闪现是基于flask
内置的session
的,利用浏览器的session缓存闪现信息
。所以必须设置secret_key
。
1.1 简单的在模板中实现获取闪现信息
实例:
server.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'] != '123':
error = '登录失败'
else:
flash('恭喜您登录成功')
return redirect(url_for('index'))
return render_template('login.html', error=error)
if __name__ == "__main__":
app.run()
注意:这个 flash() 就可以实现在下一次请求时候,将括号内的信息做一个缓存。不要忘记设置secret_key
这里是 index.html 模板:
{% with messages = get_flashed_messages() %} # 获取所有的闪现信息返回一个列表
{% if messages %}
<ul class=flashes>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<h1>主页</h1>
<p>跳转到登录页面<a href="{{ url_for('login') }}">登录?</a>
注意:{% with messages = get_flashed_messages() %} # 获取所有的闪现信息返回一个列表
这里是login.html 模板
<h1>登录页面</h1>
{% if error %}
<p class=error><strong>Error:</strong> {{ error }}
{% endif %}
<form action="" method=post>
用户名:
<input type=text name=username>
密码:
<input type=password name=password>
<p><input type=submit value=Login></p>
</form>
简单的在模板中实现获取闪现信息小结:
设置闪现内容:flash('恭喜您登录成功')
模板取出闪现内容:{% with messages = get_flashed_messages() %}
1.2 模板中的分类闪现
当闪现一个消息时,是可以提供一个分类的。未指定分类时默认的分类为'message'
。 可以使用分类来提供给用户更好的反馈,可以给用户更精准的提示信息体验。
要使用一个自定义的分类,只要使用 flash()
函数的第二个参数:
flash('恭喜您登录成功',"status")
flash('您的账户名为admin',"username")
在使用get_flashed_messages()
时候需要传入with_categories=true
便可以渲染出来类别
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<ul class=flashes>
{% for category, message in messages %}
<li class="{{ category }}">{{ category }}:{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
不同的 类别可以给用户提供更好的反馈。例如错误消息可以使用红色背景。下面是各种类别颜色
flash('恭喜,登录成功', 'info') # 蓝色
flash('登录不怎么成功', 'warning') # 红色
flash('登录不怎么成功', 'message') # 黑色
flash('登录没有成功', 'error') # 橙色
模板中的分类闪现小结:
分类设置闪现内容:
flash('恭喜您登录成功',"status")
flash('您的账户名为admin',"username")
模板取值:
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<ul class=flashes>
{% for category, message in messages %}
...
1.3 模板中过滤闪现消息
你可以视情况通过传递一个类别列表来过滤 get_flashed_messages()
的 结果。这个功能有助于在不同位置显示不同类别的消息。
同样要使用一个自定义的分类,需要使用flash()
函数的第二个参数:
flash('恭喜您登录成功',"status")
flash('您的账户名为admin',"username")
在使用get_flashed_messages()
时候需要传入category_filter=["username"]
便可根据类别取出闪现信息。中括号内可以传入的值就是类别,可以传入多个
。
{% with messages = get_flashed_messages(category_filter=["username"]) %}
{% if messages %}
<ul>
{%- for message in messages %}
<li>{{ message }}</li>
{% endfor -%}
</ul>
</div>
{% endif %}
{% endwith %}
小结
分类设置闪现内容:
flash('恭喜您登录成功',"status")
flash('您的账户名为admin',"username")
模板取值:
% with messages = get_flashed_messages(category_filter=["username"]) %}
{% if messages %}
<ul>
{%- for message in messages %}
二、 在视图中获取闪现信息
2.1 简单的在是视图中获取闪现信息
-设置: flash('xxx')
-取值:get_flashed_message() # 注意这个不同于模板取值,这个是从flask中导入的
-注意:在视图中获取闪现信息不必非得是两次连续的请求,只要保证是第一次取相应的闪现信息,就可以取得到。
例子:
from flask import Flask, request, flash, get_flashed_messages
import os
app = Flask(__name__)
app.secret_key = os.urandom(4)
app.debug = True
@app.route('/login/')
def login():
if request.args.get('name') == 'rocky':
return 'ok'
flash('第一条闪现信息:用户名不是rocky填写的是{}'.format(request.args.get('name')))
return 'error,设置了闪现'
@app.route('/get_flash/')
def get_flash():
#get_flashed_messages()是一个列表列表可以取出闪现信息,该条闪现信息只要被取出就会删除掉。
return '闪现的信息是{}'.format(get_flashed_messages())
@app.route('/demo/')
def demo():
return 'demo'
if __name__ == '__main__':
app.run()
1、触发设置闪现内容
2、 取出闪现内容
3、再次取出闪现内容,发现闪现内容取出一次后就为空了
小结
- get_flashed_messages()是一个列表,该列表可以取出闪现信息,该条闪现信息只要被取出就会删除掉。
2.2 在视图中实现分类获取闪现信息。
-
设置:
flash(‘用户名错误’, “username_error”)
flash(‘用户密码错误’, “password_error”) # 第二个参数为闪现信息的分类。 -
取所有闪现信息的类别和闪现内容:
get_flashed_messages(with_categories=True) -
针对分类过滤取值:
get_flashed_messages(category_filter=[‘username_error’])
# 中括号内可以写多个分类。
注意:如果flash()没有传入第二个参数进行分类,默认分类是 'message'
实例1
@app.route('/login/')
def login():
if request.args.get('name') == 'rocky':
return 'ok'
flash('用户名错误', category="username_error")
flash('用户密码错误', "password_error")
return 'error,设置了闪现'
@app.route('/get_flash/')
def get_flash():
return '闪现的信息是{}'.format(get_flashed_messages(with_categories=True))
把所有的闪现类别和闪现信息返回。
实例2
@app.route('/login/')
def login():
if request.args.get('name') == 'rocky':
return 'ok'
flash('用户名错误', category="username_error")
flash('用户密码错误', "password_error")
return 'error,设置了闪现'
@app.route('/get_flash/')
def get_flash():
return '闪现的信息是{}'.format(get_flashed_messages(category_filter=['username_error']))
返回页面只显示了 "username_error"
的分类内容。
原文来自:https://www.cnblogs.com/zhulipeng-1998/p/12863800.html#1221_max_agecookie_132