flask 源码专题(十):flash源码研究
flash源码
def flash(message, category="message"):
flashes = session.get("_flashes", []) # 从session中获取_flashes,没有则为空列表
flashes.append((category, message))
session["_flashes"] = flashes # 将(category, message)以元组的形式添加到flashes中,设置session存入cookie中
message_flashed.send(
current_app._get_current_object(), message=message, category=category
) # 发送信号
总结:
(1)flash必须要给message传值。不传category时则默认为message
(2)flash中用到了session存取值,所以要给他设置秘钥
(3)设置的flash数据都是列表中套元组的形式,元组的第一个数是类别,第二个数是值
get_flashed_messages源码
def get_flashed_messages(with_categories=False, category_filter=()):
flashes = _request_ctx_stack.top.flashes # 这是从请求上下文中获取flashes,后续博客会介绍请求上下文。请求刚到时获取的是None
if flashes is None:
# 在flash('xxx'),session['_flashes'] = flashes,如果有则从session中删除_flashes并赋值给 _request_ctx_stack.top.flashes = flashes = session['_flashes'],否则为空列表
_request_ctx_stack.top.flashes = flashes = (
session.pop("_flashes") if "_flashes" in session else []
)
if category_filter:
# 过滤;flashes是[(category,message),]这种形式的数据。过滤出你要取出的message
flashes = list(filter(lambda f: f[0] in category_filter, flashes)) if not with_categories:
# 如果不带有过滤字段,则返回所有的flashes值
return [x[1] for x in flashes]
return flashes
总结:
# 设置两个flash,第一个默认category为message,第二个category为two
flash('第一个flash')
flash('第二个flash','two')
with_categories:是否带上category,category_filter:返回为该类名的flash值
(1)get_flashed_messages():with_categories默认为False,category_filter默认为(),返回的值是 ['第一个flash', '第二个flash']
(2)get_flashed_messages(with_categories=True):返回的值是 [('message', '第一个flash'), ('two', '第二个flash')],带上类名
(3)get_flashed_messages(category_filter='two'):返回的值是 ['第二个flash'],过滤出类名为two的flash值。过滤多个分类时用元组或列表
(4)get_flashed_messages(with_categories=True,category_filter=['two','message']):返回的值是 [('message', '第一个flash'), ('two', '第二个flash')]
扩展
在同一个请求中可以多次获取flash值,即可以多次调用get_flashed_messages()。而在第二个请求中get_flashed_messages()获取到的就是个[]
@app.route('/test1')
def test1():
# 同一请求多次调用get_flashed_messages方法
data = get_flashed_messages()
data1 = get_flashed_messages()
return '获取的信息:%s,%s'%(data,data1)
@app.route('/test2')
def test2():
# 在发起/test1请求后,再发起/test2请求,此时get_flashed_messages()获取到的是个空列表[]
data = get_flashed_messages()
return '获取的信息:%s'%data
原因:
源码中第一次flashes是从session中获取,并且存到了_request_ctx_stack.top.flashes = flashes中,再次在该请求中调用方法时直接从flashes中可以获取。所以可以在同一请求中多次调用get_flashed_messages方法
而在第一次请求中执行了 session.pop("_flashes")。所以在第二次请求中便取不到flashes了。所以不能在第二次请求中获取flash值
flashes = _request_ctx_stack.top.flashes
if flashes is None:
_request_ctx_stack.top.flashes = flashes = (
session.pop("_flashes") if "_flashes" in session else []
)
return flashes
flask 源码专题(十):flash源码研究的更多相关文章
- flask 源码专题(五):SqlAlchemy 中操作数据库时session和scoped_session的区别
1原生session: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalc ...
- flask 源码专题(二):请求上下文与全文上下文
源码解析 0. 请求入口 if __name__ == '__main__': app.run() def run(self, host=None, port=None, debug=None, lo ...
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
C# DateTime的11种构造函数 别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...
- OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools. ...
- OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...
- Flask框架(五) —— session源码分析
Flask框架(五) —— session源码分析 目录 session源码分析 1.请求来了,执行__call__方法 2.__call__方法 3.调用__call__方法 3.1.ctx = s ...
- netty源码分析(十八)Netty底层架构系统总结与应用实践
一个EventLoopGroup当中会包含一个或多个EventLoop. 一个EventLoop在它的整个生命周期当中都只会与唯一一个Thread进行绑定. 所有由EventLoop所处理的各种I/O ...
- mybatis源码专题(2)--------一起来看下使用mybatis框架的insert语句的源码执行流程吧
本文是作者原创,版权归作者所有.若要转载,请注明出处.本文以简单的insert语句为例 1.mybatis的底层是jdbc操作,我们先来回顾一下insert语句的执行流程,如下 执行完后,我们看下数据 ...
- 【 js 基础 】【 源码学习 】backbone 源码阅读(三)浅谈 REST 和 CRUD
最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-stud ...
随机推荐
- 【php】 jsonp转数组函数jsonp_decode
分享一个可以跟json一样用的函数jsonp_decode,能把jsonp格式数据转为php数组或对象. /** * 把jsonp转为php数组 * @param string $jsonp js ...
- log4j2简介
Apache Log4j 2 Apache Log4j 2是对Log4j的升级,它比它的前辈Log4j 1提供了显著的改进.在解决Logback的架构中存在的一些固有问题时,提供了许多可用的改进. 特 ...
- TensorFlow从0到1之TensorFlow Keras及其用法(25)
Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,你可以编译和拟合模型.之后,它可以用于预测.变量声明.占位 ...
- nslookup使用及常用命令
nslookup是命令行里一个常用的DNS查询工具,最常用的功能是域名解析和反向解析. 下面罗列一些常用的nslookup命令 nslookup # 进入交互模式 >域名 # 进行正向解析 &g ...
- Android学习笔记物理按键事件处理
常见的物理按键: Android为每个物理按键都提供了如下几个回调方法: 代码示例: package com.example.demo3; import androidx.appcompat.app. ...
- Python学习日志-01
一.使用入门 (1)问答环节 人们为何使用Python: 软件质量高:Python更注重可读性.一致性和软件质量,这将其与脚本语言世界中的其他工具区别开来.因为代码的设计致力于可读性,因此比起传统脚本 ...
- 007.OpenShift管理应用部署
一 REPLICATION CONTROLLERS 1.1 RC概述 RC确保pod指定数量的副本一直运行.如果pod被杀死或被管理员显式删除,复制控制器将自动部署相应的pod.类似地,如果运行的po ...
- 大型ECShop安装搬家升级错误问题最全攻略
[引子] 最近将ECShop框架网站从租用服务器搬家至阿里云,虽然模块及功能上已经被修改的面目全非了,但基础部分还在. 在这个过程中遇到了很多的WARNING与ERROR,解决方案如下. [环境] 服 ...
- Java 中的数据结构类 Vector 和 ArrayList
今天刷算法题目时,使用到了 Java 的内置栈类 Stack,好奇它是怎么实现的,发现它是继承于 Vector 这个类.那么,就先学习下 Vector 这个类的实现吧! Vector 和 ArrayL ...
- vue指令,实例成员,父子组件传参
v-once指令 """ v-once:单独使用,限制的标签内容一旦赋值,便不可被动更改(如果是输入框,可以主动修改) """ <di ...