端正态度

随着公众号文章更新的数量越来越多,有一些陌生的朋友了解到了清风Python。有关注公众号的读者、有添加微信一起讨论python的朋友,还有申请转载和让投稿与兼职线下培训答疑的机构。感谢大家的支持,但还是想在这里说明下,做公众号的初衷是总结日常学习的内容,将公众号做成变相的博客。目的是能督促自己一周七天除了周五晚上,都能安心的学习。逆水行舟不进则退,希望大家坚持每天所有学有所获。

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.pyfrom flask import Flask, flash, get_flashed_messagesapp = 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有一个初步的认识。实现效果如下:

首次访问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'] = flashesmessage_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.flashesif 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.pyfrom flask import Flask, flash, redirect, render_template, \request, url_forapp = 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()

实现效果如下:

我们在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的之名啊…

The End

今天的flask框架flash消息闪现就带大家学习到这里,如果觉得内容对你有所帮助,可以点击文章右下角的“在看”。
欢迎将这篇文章或我的微信公众号【清风Python】分享给更多喜欢python的人,谢谢。

Flask框架flash消息闪现学习与优化符合闪现之名#华为云·寻找黑马程序员#相关推荐

  1. 车标知识学习网页开发,与Flask通过base64展示二进制图片 #华为云·寻找黑马程序员#

    万法同源 一直觉得可能自己不太适合搞技术,更适合在天桥底下支个摊子说书.技术的东西从来没人关注,扯东扯西的文章莫名的火.之前的一篇文章MarkDown添加图片的三种方式不管是在技术为主的CSDN还是娱 ...

  2. Flask开发VIP版HttpServer #华为云·寻找黑马程序员#

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  3. Flask开发成语接龙游戏,以后闲了手机玩玩自己写的游戏吧!#华为云·寻找黑马程序员#

    文章目录 明天你好,我叫干不倒 英语单词学习应用 成语接龙 接龙规则 实现分析 数据库信息 登陆排行 游戏界面 成语判断 拼音识别 代码编写 Jinjia2模板 Flask装饰器 游戏演示 手机搭建项 ...

  4. Flask使用bootstrap为HttpServer添加上传文件功能 #华为云·寻找黑马程序员#

    一句题外话 昨天是老妈的生日,可惜周一上班没有办法为她庆生,只能电话问候下.但还是在这里补说一句"生日快乐!"(ps:我妈每天都会看我的公众号,哈哈-) 提个小需求 今天朋友说,之 ...

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

    Flask的flash 第一次知道Flask有flash这个功能时,听这名字就觉得高端,消息闪现-是跳刀blink闪烁躲技能的top10操作吗?可结果让我好失望,哪里有什么闪现的效果,不过是平常的消息 ...

  6. Python学习笔记(飞机大战项目练习)---B站黑马程序员

    学习目标: 完整的一个小项目开发 提示:这里可以添加学习目标 例如: 一周Python入门项目实战知识 学习内容: 0 安装pygame 模块: PS C:\Users\tanyugen\Pychar ...

  7. 2023年黑马程序员Java学习路线图

    2023年Java学科免费学习资源放送40+套课程,超过600小时的内容! 在过去的一年里,为了帮助更多人线上充电,学会更多技能,黑马程序员举办了 150+ 场免费直播公开课,新增精品视频教程 80+ ...

  8. Flask学习 黑马程序员-6节课入门Flask框架web开发视频(中途撤退,寻找py3教程)

    文章目录 postman工具 get和post 如何给路由传参 解析 @app.route('')这个叫视图函数 Jinja2模板引擎 动态传参 注释.变量代码块以及控制代码块的使用 注释:ctrl+ ...

  9. SSM 框架学习(黑马程序员)

    (Spring+SpringMVC+MyBatis) SSM框架教程 黑马程序员最全SSM框架教程|Spring+SpringMVC+MyBatis全套教程 01. Spring 简介 1.1 Spr ...

  10. 黑马程序员视频教程学习mybatis框架常用注释SQL语句学习笔记?

    mybatis学习笔记 常用注释增删改查SQL语句 常用注释拓展SQL语句 解决实体类属性和数据库表中的属性名称不相同的问题: mybatis注解之一对一查询: mybatis注解之一对多查询: my ...

最新文章

  1. Hive-1.2.0学习笔记(一)安装配置
  2. Linux学习记录--数据流重定向
  3. Android activity生命周期
  4. 冰墩墩+周杰伦也救不了NFT
  5. 图元和片元_OpenGL中的顶点、 图元、片元、像素的含义
  6. oracle11g 隐藏参数_ORACLE 11GR2常用参数(含隐含参数)设置
  7. 中医科学院院士团队解析丹参纯合基因组和新基因簇在丹参酮合成中的作用
  8. webpack4.0各个击破(8)—— tapable篇
  9. 织梦编程run=php,dedecms织梦怎么用runphp='yes'运行php
  10. JS调试的时候遇到无限debugger怎么办?
  11. hibernate--生成正向和逆向工程
  12. C语言实现字符串转二进制编码,并保存.txt
  13. layabox 学习笔记
  14. 4399游戏Web前端工程师2021秋招面经
  15. B站头部UP主抱团垄断优质资源,腰部UP主的流量突破口在哪?
  16. 吐血分享:QQ群霸屏技术教程(利润篇)
  17. CAD命令行不见了怎么重新恢复?
  18. 数据库系统概念第六版 第五章练习题 2 4
  19. hackthebox-admirer (adminer渗透 python-library-hijacking)
  20. OpenStack 运维 - 部署Nova组件 [T版]

热门文章

  1. 数学基础知识总结 —— 1. 常用导数公式
  2. 北京市关于印发建筑工人实名制管理办法(试行)的通知
  3. Bandizip如何加密档案内文件名(让别人无法预览)
  4. win10局域网 开启网络发现,无法找到本机
  5. 西南大学计算机试题答案,17秋西南大学计算机组成原理【0013】机考答案
  6. mysql mpm_zabbix+mysql mpm监控
  7. Lambda表达式与函数式接口详解
  8. 概念数据模型到逻辑数据模型的转化
  9. react + antd table +hooks 如何实现表格序号自增 翻页后序号不从1开始算起
  10. 解构华为AI技术布局:构建无所不及的智能