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源码研究的更多相关文章

  1. flask 源码专题(五):SqlAlchemy 中操作数据库时session和scoped_session的区别

    1原生session: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalc ...

  2. flask 源码专题(二):请求上下文与全文上下文

    源码解析 0. 请求入口 if __name__ == '__main__': app.run() def run(self, host=None, port=None, debug=None, lo ...

  3. C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库

    C# DateTime的11种构造函数   别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...

  4. OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天

    在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools. ...

  5. OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa

    元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...

  6. Flask框架(五) —— session源码分析

    Flask框架(五) —— session源码分析 目录 session源码分析 1.请求来了,执行__call__方法 2.__call__方法 3.调用__call__方法 3.1.ctx = s ...

  7. netty源码分析(十八)Netty底层架构系统总结与应用实践

    一个EventLoopGroup当中会包含一个或多个EventLoop. 一个EventLoop在它的整个生命周期当中都只会与唯一一个Thread进行绑定. 所有由EventLoop所处理的各种I/O ...

  8. mybatis源码专题(2)--------一起来看下使用mybatis框架的insert语句的源码执行流程吧

    本文是作者原创,版权归作者所有.若要转载,请注明出处.本文以简单的insert语句为例 1.mybatis的底层是jdbc操作,我们先来回顾一下insert语句的执行流程,如下 执行完后,我们看下数据 ...

  9. 【 js 基础 】【 源码学习 】backbone 源码阅读(三)浅谈 REST 和 CRUD

    最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-stud ...

随机推荐

  1. 2019-02-15 python接口图灵机器人(简单好玩)

    import requests import json def Run(text): url = "http://openapi.tuling123.com/openapi/api/v2&q ...

  2. ComplexHeatmap|根据excel表绘制突变景观图(oncoplot)

    本文首发于“生信补给站”:https://mp.weixin.qq.com/s/8kz2oKvUQrCR2_HWYXQT4g 如果有maf格式的文件,可以直接oncoplot包绘制瀑布图,有多种展示和 ...

  3. deepin双屏实现方式

    先xrandr --listproviders看下有几个provider,如果有多个,那么可能是不同显示口在不同显卡上,运行xrandr --setprovideroutputsource 0 1或x ...

  4. CODING DevOps 系列第三课:云计算、云原生模式下 DevOps 的建设

    本文首先会和大家分享当前整个应用生命周期的演变历程,然后讲解云计算模式下 DevOps 建设包含的过程.流程规范和标准,最后讲解云原生时代到来会带来哪些改变,以及标准化的建设会有哪些改变和突破. 应用 ...

  5. django xadmin 配置过程

    1.拷贝xadmin的一个下的一个xadmin文件夹放到项目里

  6. Java是如何实现Future模式的?万字详解!

    JDK1.8源码分析项目(中文注释)Github地址: https://github.com/yuanmabiji/jdk1.8-sourcecode-blogs 1 Future是什么? 先举个例子 ...

  7. 分享 HT 实用技巧:实现指南针和 3D 魔方导航

    前言 三维场景时常需要一个导航标识,用来确定场景所处的方位. 一般有两种表现形式:指南针.小方盒(方位魔方). 参考一下百度百科中的 maya 界面,可以看到右上角有一个标识方位的小盒子,说的就是它: ...

  8. node+ajax实战案例(5)

    6.添加客户 6.1.点击添加按钮,弹出表单框 // 添加用户 显示对话框 var addBtn = document.getElementById('add-btn'); var addUser = ...

  9. python冷知识

    目录 省略号也是对象 奇怪的字符串 and 和 or 的取值顺序 访问类中的私有方法 时有时无的切片异常 两次 return for 死循环 intern机制 省略号也是对象 在python中一切皆对 ...

  10. 浅谈pyautogui模块

    pyautogui模块 PyAutoGUI--让所有GUI都自动化 安装代码: pip install pyautogui 目的 PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以 ...