Flask消息闪现

时间:2021-12-05 21:47:04

Flask消息闪现

一个好的应用和用户界面都需要良好的反馈。如果用户得不到足够的反馈,那么应用最终会被用户唾弃。

Flask 的闪现系统提供了一个良好的反馈方式。

闪现系统的基本工作方式是:

  • 在且只在下一个请求中访问上一个请求结束时记录的消息。
  • 一般我们 结合布局模板来使用闪现系统。
  • 注意,浏览器会限制 cookie 的大小,有时候网络服 务器也会。这样如果消息比会话 cookie 大的话,那么会导致消息闪现静默失败。

简单的例子

以下是一个完整的示例:

from flask import Flask, flash, redirect, render_template, \
request, url_for app = Flask(__name__)
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/' @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'] != 'secret':
error = 'Invalid credentials'
else:
flash('You were successfully logged in')
return redirect(url_for('index'))
return render_template('login.html', error=error)

上面py文件比如保存为flashtest.py

以下是实现闪现的 layout.html 模板:

注,html模板默认放在项目的templates目录下。

<!doctype html>
<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 %}

以下是继承自 layout.htmlindex.html 模板:

{% extends "layout.html" %}
{% block body %}
<h1>Overview</h1>
<p>Do you want to <a href="{{ url_for('login') }}">log in?</a>
{% endblock %}

以下是同样继承自 layout.htmllogin.html 模板:

{% extends "layout.html" %}
{% block body %}
<h1>Login</h1>
{% if error %}
<p class=error><strong>Error:</strong> {{ error }}
{% endif %}
<form 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 %}

运行应用

>set FLASK_APP=flashtest.py
>python -m flask run

访问默认的127.0.0.1:5000可见闪现效果:

Flask消息闪现

闪现消息的类别

闪现消息还可以指定类别,如果没有指定,那么缺省的类别为 'message' 。不同的 类别可以给用户提供更好的反馈。例如错误消息可以使用红色背景。(样式要自己根据class=类别额外去写好css)

使用 flash() 函数可以指定消息的类别:

flash(u'Invalid password provided', 'error')

注: 这一行是添加在 error= 'Invalid credentials' 这一行之后:

@app.route('/login', methods=['GET','POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != 'admin' or \
request.form['password'] != 'secret':
error= 'Invalid credentials'
flash(u'Invalid password provided', category='error')
else:
flash('You were successfully logged in')
return redirect(url_for('index'))
return render_template('login.html',error=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 %}

上例展示如何根据类别渲染消息,还可以给消息加上前缀,如 <strong>{{ category }}:</strong>

<!DOCTYPE html>
<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 }}"><strong>{{ category }}:</strong>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block body %}{% endblock %}

注:虽然可以拿到类别,但是要依据类别来写li标签的样式,让错误信息显示是红色背景还要自己额外去写好样式哦。

过滤闪现消息

你可以视情况通过传递一个类别列表来过滤 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 %}

flask.flash()get_flashed_messages() 官网说明如下:

Message Flashing

  • flask.flash(message, category='message')

Flashes a message to the next request. In order to remove the flashed message from the session and to display it to the user, the template has to call get_flashed_messages().

Parameters:

message – the message to be flashed.

category – the category for the message.

The following values are recommended:

'message' for any kind of message,

'error' for errors,

'info' for information messages and 'warning' for warnings.

However any kind of string can be used as category.

  • flask.get_flashed_messages(with_categories=False, category_filter=[])

Pulls all flashed messages from the session and returns them. Further calls in the same request to the function will return the same messages. By default just the messages are returned, but when with_categories is set to True, the return value will be a list of tuples in the form (category, message) instead. Filter the flashed messages to one or more categories by providing those categories in category_filter. This allows rendering categories in separate html blocks. The with_categories and category_filter arguments are distinct: with_categories controls whether categories are returned with message text (True gives a tuple, where False gives just the message text). category_filter filters the messages down to only those matching the provided categories.

See 消息闪现 for examples.

Parameters:

with_categories – set to True to also receive categories.

category_filter – whitelist of categories to limit return values

从官网里可以看出,flash() 函数:

  • 第一个参数是你将要放进去的字符串消息,

  • 第二个默认参数category,代表消息的类别,默认为message(消息,普通)。

get_flashed_messages() 两个默认参数,第一个是类别控制开关,默认是False。

  • 类别控制是否带消息文本返回类别:
    • True给出一个tuple,元祖中给出两个值,分别是消息文本和类别;
    • False只给出消息文本,不返回类别。

文:铁乐与猫

2018-9-6

参考

Flask-消息队列