Flask框架flash消息闪现学习与优化符合闪现之名
Flask的flash
第一次知道Flask有flash这个功能时,听这名字就觉得高端,消息闪现…是跳刀blink闪烁躲技能的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有一个初步的认识。实现效果如下:
首次访问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()
实现效果如下:
我们在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的人,谢谢。
作者:清风Python
Flask框架flash消息闪现学习与优化符合闪现之名的更多相关文章
- flask模板应用-消息闪现(flash())
消息闪现 flask提供了一个非常有用的flash()函数,它可以用来“闪现”需要提示给用户的消息,比如当用户登录成功后显示“欢迎回来!”.在视图函数调用flash()函数,传入消息内容,flash( ...
- Flask框架(二)—— 反向解析、配置信息、路由系统、模板、请求响应、闪现、session
Flask框架(二)—— 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 目录 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 一.反向解析 1.什么是反向解析 ...
- python tornado 中使用 flash消息闪现
1.html 中引入文件 {% block head %} <link href="/static/common/sweetalert/sweetalert.css" rel ...
- 基于Flask框架搭建视频网站的学习日志(三)之原始web表单
基于Flask框架搭建视频网站的学习日志(三)1.原始Web 表单 本节主要用于体验一下前端后端直接数据的交互,样例不是太完善,下一节会加入Flash处理,稍微完善一下页面 (备注:建议先阅读廖雪峰老 ...
- 学习Flask框架
# -*- encoding: utf-8 -*- #导包 from flask import Flask #建立flask对象 app = Flask(__name__) #使用flask路由器 ...
- Flask从入门到精通之Flash消息
请求完成后,有时需要让用户知道状态发生了变化.这里可以使用确认消息.警告或者错误提醒.一个典型例子是,用户提交了有一项错误的登录表单后,服务器发回的响应重新渲染了登录表单,并在表单上面显示一个消息,提 ...
- Flask框架的学习与实战(一):开发环境搭建
Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2.很多功能的实现都参考了django框架.由于项目需要,在 ...
- python web开发之flask框架学习(2) 加载模版
上次学习了flask的helloword项目的创建,这次来学习flask项目的模版加载: 第一步:创建一个flask项目 第二步:在项目目录的templates文件夹下创建一个html文件 第三步: ...
- Flask框架的学习与实战(二):实战小项目
昨天写了一篇flask开发环境搭建,今天继续,进行一个实战小项目-blog系统. blog系统很简单,只有一个页面,然而麻雀虽小五脏俱全.这里目的不是为了做项目而做项目,这篇文章本意是通过这次练习传达 ...
随机推荐
- [开源]基于goapp+xterm实现webssh-网页上的SSH终端(golang)
简析 基于goapp+xterm实现webssh-网页上的SSH终端. 开源地址见文末. 特性 在网页上实现一个SSH终端.从而无需Xshell之类的模拟终端工具进行SSH连接. 可以对交互命令进行审 ...
- docker基本操作教程
镜像操作 获取镜像 从Docker Hub搜索镜像: docker search ubuntu 下载镜像: docker pull ubuntu:18.04 若下载镜像速度较慢,更改镜像源: Ubun ...
- 多线程之美1一volatile
目录 一.java内存模型 1.1.抽象结构图 1.2.概念介绍 二.volatile详解 2.1.概念 2.2.保证内存可见性 2.3.不保证原子性 2.4.有序性 一.java内存模型 1.1.抽 ...
- Docker学习-VMware Workstation 本地多台虚拟机互通,主机网络互通,解决name or service not known
NAT网络通用配置 测试连接 主机到虚拟机 虚拟机到虚拟机 ,虚拟机到外网 CentOS,提示name or service not known 设置DNS服务器 vi /etc/resolv.co ...
- requests模块使用代理
1.创建try_proxies.py文件import requestsproxies = {"http":"http:117.135.34.6:8060"}he ...
- 【Java】final修饰符的使用
final修饰符的使用 1.修饰类: final修饰的类不能被继承,final修饰的类里面的方法都是(隐式)final方法 2.修饰方法: final修饰的方法不能被重写 3.修饰变量(被修饰的变量一 ...
- shell配置文件
个人配置主要集中在-/.profile文件中 打开新的交互式shell时,配置文件的执行顺序是/etc/profile /etc/bashrc ~/.profile 最后是~/.bashrc ...
- objc反汇编分析,block函数块为何物?
上一篇向大家介绍了__block变量的反汇编和它的伪代码,本篇函数块block,通常定义成原型(^){},它在反汇编中是什么东西. 我们先定义将要反汇编的例子,为减少篇幅例子采用non-arc环境. ...
- jeson navo
QT TEMPLATE = app CONFIG += console c++11 CONFIG -= app_bundle CONFIG -= qt INCLUDEPATH += /usr/loca ...
- vue跨域处理
本人对于vue跨域处理流程不是很清楚,特此理顺一遍. 1.在config中进行配置,该文件不是都存在,需要自己建: proxyTable,这个参数主要是一个地址映射表,你可以通过设置将复杂的url简化 ...