Flask框架flash消息闪现学习与优化符合闪现之名

简介: 第一次知道Flask有flash这个功能时,听着名字就觉得高端,==消息闪现==...是跳刀闪烁躲技能的top10操作吗?可结果让我好失望,那里有什么闪现的效果,不过是平常的消息传输与展示罢了。那么今天我就带着大家在学习flash功能的基础上,增加闪现效果!

Flask的flash


第一次知道Flask有flash这个功能时,听着名字就觉得高端,==消息闪现==...是跳刀闪烁躲技能的top10操作吗?可结果让我好失望,那里有什么闪现的效果,不过是平常的消息传输与展示罢了。那么今天我就带着大家在学习flash功能的基础上,增加闪现效果!


flash介绍


好的应用和用户界面的重点是回馈。如果用户没有得到足够的反馈,他们可能最终会对您的应用产生不好的评价。

Flask 提供了一个非常简单的方法来使用闪现系统向用户反馈信息。

闪现系统使得在一个请求结束的时候记录一个信息,然后在且仅仅在下一个请求中访问这个数据。这通常配合一个布局模板实现

以上内容来自Flask官方文档,对flash的说明http://docs.jinkan.org/docs


这几句话你只需记住两点即可:

  • 一个请求结束时记录
  • 仅仅在下一个请求中访问

关于介绍的误解


flash介绍中说了,在一个请求结束时记录flash,然后仅仅在下一个请求中访问。此处的下一个请求,不是任意的请求,而是下一次获取flash内容的请求。

来看一个例子:

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清风Python
# @Date     : 2019/7/14 22:36
# @Software : PyCharm
# @version  :Python 3.7.3
# @File     : demo.py
from flask import Flask, flash, get_flashed_messages
app = Flask(__name__)
app.secret_key = 'not guess'
@app.route('/')
def index():
    flash("add flash -- hello Flask")
    return "<h3> Add Flash </h3>"
@app.route('/hello')
def hello():
    return "<h3> Hello World </h3>"
@app.route('/read')
def read():
    return "<h3> %s </h3>" % get_flashed_messages()
if __name__ == '__main__':
    app.run(port=5001)

这段代码我就不使用html模板渲染的,只是通过这个例子让大家先对flash有一个初步的认识。实现效果如下:

网络异常,图片无法展示
|

flash初探.gif


首次访问http://127.0.0.1:5001,我们添加了flash,之后的下一个请求,我们去访问了一个hello的uri,此时我们简单返回了helloworld,那么此时的flash是否还存在?接下来我们去访问了read的uri,读取到了flash的内容,然后再次访问read去读取flash的时候已经为空了...

所以,不要被flash官网中说的仅仅在下一次请求给误解了,应该是仅仅在下一次获取flash的请求中获取。再次访问时清空,那么flash的实现方式是什么呢?其实很简单...

flash实现原理

flash的实现原理,其实就是简单的在浏览器中添加session与删除session这么简单,具体如何操作的呢?


flash 方法:

def flash(message, category='message'):
    flashes = session.get('_flashes', [])
    flashes.append((category, message))
    session['_flashes'] = flashes
    message_flashed.send(current_app._get_current_object(),
                         message=message, category=category)


get_flashed_messages 方法:

def get_flashed_messages(with_categories=False, category_filter=[]):
    flashes = _request_ctx_stack.top.flashes
    if flashes is None:
        _request_ctx_stack.top.flashes = flashes = session.pop('_flashes') \
            if '_flashes' in session else []
    if category_filter:
        flashes = list(filter(lambda f: f[0] in category_filter, flashes))
    if not with_categories:
        return [x[1] for x in flashes]
    return flashes

其他的内容你都可以忽略,只要关注两点即可:

flashes = session.get('_flashes', []) ; flashes.append((category, message))

session.pop('_flashes')

这么看是不一目了然,flash的时候给session中塞入一个_flashes的list,然后开始append,get_flashed_messages的时候把session中的_flashes pop出来,即达到了最终的请求结束前设置,仅供下一次获取flash时使用...

那么既然看了源码,大家肯定注意到一个category的参数,这个是用来干嘛的?


category参数操作


flash消息既然是用于消息闪现,必然有好消息、坏消息与默认消息,系统默认的category='message',那么如果我们将category设置为其他类型呢?

比如flash('用户名或密码错误...', category='error'),那么我们在模板中针对flash可以做些什么事情?


分类展示

get_flashed_messages(with_categories=true)

with_categories=true代表我们启用消息分类,之后针对消息类型,可以进行相关的过滤操作

{% 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 %}

过滤消息

get_flashed_messages(category_filter=["error"]

{% 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 %}

这个就比较简单了,为message添加一个过滤器,在日常中,我们完全可以重写自己的方法...


综合例子


介绍了这么多,我们来设计一个案例,简单的用户登录界面,如果用户输入的用户名密码错误,则显示错误消息,如果用户登录成功则跳转页面,并欢迎一下小盆友。因为登录和跳转页面都需要使用到flash,则创建一个base.html的模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>BreezePython</title>
</head>
<body>
{% block info %}{% endblock %}
{% with messages = get_flashed_messages(with_categories=true) %}
  {% if messages %}
    <ul class=flashes>
    {% for category, message in messages %}
        {% if category =='error'%}
            <li style="color:red">{{ message }}</li>
        {% else %}
            <li style="color:green">{{ message }}</li>
        {% endif %}
    {% endfor %}
    </ul>
  {% endif %}
{% endwith %}
</body>
</html>

之后分别在登录和欢迎页面引入该模板...


login.html:

{% extends "base.html" %}
{% block info %}
<h2>欢迎登陆系统</h2>
<form action="" method=post>
    <dl>
      <dt>用户名:
      <dd><input type=text name=username value="{{
          request.form.username }}">
      <dt>密码:
      <dd><input type=password name=password>
    </dl>
    <p><input type=submit value=Login>
  </form>
{% endblock %}


index.html

{% extends "base.html" %}
{% block info %}
<h2>恭喜 {{user}} ,您已登陆!</h2>
{% endblock %}


然后创建app.py进行调度:

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清风Python
# @Date     : 2019/7/14 23:17
# @Software : PyCharm
# @version  :Python 3.7.3
# @File     : app.py
from flask import Flask, flash, redirect, render_template, \
    request, url_for
app = Flask(__name__)
app.secret_key = 'not guess'
@app.route('/', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        if request.form['username'] != 'qingfeng' or \
                request.form['password'] != 'python':
            flash('用户名或密码错误...', category='error')
            flash('上点心再输入一次...', category='error')
        else:
            flash('登陆成功', category='info')
            return render_template('index.html', user=request.form['username'])
    return render_template('login.html')
if __name__ == "__main__":
    app.run()


实现效果如下:


网络异常,图片无法展示
|

flash消息实例.gif

我们在base.html中针对不同类型的消息进行了颜色的过滤,为了让大家了解flash其实是一个列表,所以添加了两条错误信息。

希望这个实例能让大家对flash有进一步的了解。


flash如何闪现?


为了可以让flash真的如何闪现之名,我们应该让flash消息,出现跳刀闪烁消失的效果,如何来做?简单的使用jQuery即可!只需两行代码


base.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>BreezePython</title>
</head>
<body>
{% block info %}{% endblock %}
<div class="flash">
{% with messages = get_flashed_messages(with_categories=true) %}
  {% if messages %}
    <ul class=flashes>
    {% for category, message in messages %}
        {% if category =='error'%}
            <li style="color:red">{{ message }}</li>
        {% else %}
            <li style="color:green">{{ message }}</li>
        {% endif %}
    {% endfor %}
    </ul>
  {% endif %}
{% endwith %}
</div>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script>$(".flash").fadeOut(3000);</script>
</body>
</html>


我们通过jQuery自带的fadeOut动画效果,即可达到我们的闪现的效果:

网络异常,图片无法展示
|

flash闪现之名.gif

这才符合flash的闪现之名啊....


The End


今天的flask框架flash消息闪现就带大家学习到这里




相关文章
|
17天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【4月更文挑战第9天】本文对比了Python三大Web框架Django、Flask和Pyramid。Django功能全面,适合快速开发,但学习曲线较陡;Flask轻量灵活,易于入门,但默认配置简单,需自行添加功能;Pyramid兼顾灵活性和可扩展性,适合不同规模项目,但社区及资源相对较少。选择框架应考虑项目需求和开发者偏好。
|
5天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
22 1
|
5天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
12 1
Flask框架在Python面试中的应用与实战
|
8天前
|
JSON 数据格式 Python
如何在Flask框架中定义路由和处理请求?
【4月更文挑战第18天】在Flask框架中,创建应用实例、定义路由和处理请求涉及5个步骤:1) 导入Flask并实例化应用;2) 使用`app.route()`装饰器定义路由,指定URL和HTTP方法;3) 编写视图函数处理请求逻辑;4) 视图函数返回响应内容,Flask会自动转换格式;5) 用`app.run()`启动服务器。
21 3
|
11天前
|
前端开发 数据挖掘 API
使用Python中的Flask框架进行Web应用开发
【4月更文挑战第15天】在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架。它简洁、灵活且易于扩展,使得开发者能够快速地构建出高质量的Web应用。本文将深入探讨Flask框架的核心特性、使用方法以及在实际开发中的应用。
|
1月前
|
XML JSON API
通过Flask框架创建灵活的、可扩展的Web Restful API服务
通过Flask框架创建灵活的、可扩展的Web Restful API服务
|
1月前
|
开发框架 API 数据库
盘点Python网页开发轻量级框架Flask知识
盘点Python网页开发轻量级框架Flask知识
41 0
|
11天前
|
数据库 开发者 Python
Python中使用Flask构建简单Web应用的例子
【4月更文挑战第15天】Flask是一个轻量级的Python Web框架,它允许开发者快速搭建Web应用,同时保持代码的简洁和清晰。下面,我们将通过一个简单的例子来展示如何在Python中使用Flask创建一个基本的Web应用。
|
1月前
|
负载均衡 Java Nacos
python flask服务如何注册到nacos
一文讲清楚python flask服务如何注册到nacos
95 2
python flask服务如何注册到nacos
|
1月前
|
缓存 监控 API
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
58 0