Flask-11 消息闪现flash

消息闪现

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值