当前位置: 首页 > news >正文

(二十一)Flask之上下文管理第二篇(细细扣一遍源码)

每篇前言:

  • 🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者

  • 🔥🔥本文已收录于Flask框架从入门到实战专栏:《Flask框架从入门到实战》
  • 🔥🔥热门专栏推荐:《Python全栈系列教程》、《Django框架从入门到实战》、《爬虫从入门到精通系列教程》、《前端系列教程》、《tornado一条龙+一个完整版项目》。
  • 📝​📝本专栏面向广大程序猿,为的是大家都做到Flask从入门到精通,穿插有很多实战优化点。
  • 🎉🎉订阅专栏后可私聊进一千多人Python全栈交流群(手把手教学,问题解答); 进群可领取Python全栈教程视频 + 多得数不过来的计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
  • 🚀🚀加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!

在这里插入图片描述

经过上文分析,我们可以将整个过程分为三阶段:

  1. 将ctx对象(包含request和session)放到Local对象中;

  2. 视图函数导入:request/session;

  3. 请求处理完毕:

    • 获取session并加密后保存到cookie
    • 将ctx删掉

第一阶段:

将ctx对象(包含request和session)放到Local对象中。

在这里插入图片描述

进去(下图中self就是ctx对象!):

在这里插入图片描述

继续进:

在这里插入图片描述

显而易见,上述_request_ctx_stack是一个全局变量,在整个应用程序的生命周期中它只创建一次!这是一种单例模式的实现方式~

继续进:

在这里插入图片描述

可以看到这个对象里又包了一个对象,这个_local对象才是真正存ctx的!而上面的_request_ctx_stack对象则相当于是一个代理,每次需要存ctx的时候都要先交给代理,代理再将其给到真正存储ctx的_local对象里!

上述push方法中_local对象点stack又会触发Local对象的__setattr__方法:

在这里插入图片描述

下图以第一阶段为主画了个简单的流程图,以便大家更好地梳理!
在这里插入图片描述

拓展一:flask里的session 是什么时候创建,什么时候销毁的?

当请求刚进来的时候,会将request和session封装成一个request_context对象,接下来通过LocalStack把这个对象放到内部的Local里【注意:现在session还是空的!】

下一步,执行open_session,将cookie里的值拿来处理后再放到Local中的ctx里。

最后,返回的时候要执行save_session将ctx里的session读出来序列化后存到用户cookie中,再将ctx给pop掉~

第二阶段:

分析下图的流程:

在这里插入图片描述

from flask import Flask, requestapp = Flask(__name__)@app.route('/')
def hello_world():print(request)    # 执行request对象的__str__方法request.method    # 执行request对象的__getattr__(key='method')方法return 'hello world~'if __name__ == '__main__':app.__call__app.run()

看源码,进request:

在这里插入图片描述

回去:

from flask import Flask, requestapp = Flask(__name__)@app.route('/')
def hello_world():print(request)    # LocalProxy对象的__str__     request.method    # LocalProxy对象的__getattr__(key='method')      这一步应该包含多个操作:先去ctx中拿到request,再去request中获取methodreturn 'hello world~'if __name__ == '__main__':app.__call__app.run()

进LocalProxy源码:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

进去_get_current_object()

在这里插入图片描述

__local就是最开始传给LocalProxy的经过偏函数处理的那个函数,下图中的这个:

在这里插入图片描述

__local函数加括号执行这个函数,进去看:

在这里插入图片描述

继续看session:

在这里插入图片描述

如上图所指会执行session对象的__setitem__方法~

进session源码:

和request区别就是传的参数是session:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

跳出来:

在这里插入图片描述

from flask import Flask, request, sessionapp = Flask(__name__)@app.route('/')
def hello_world():print(request)    # LocalProxy对象的__str__request.method    # LocalProxy对象的__getattr__      这一步应该包含多个操作:先去ctx中拿到request,再去request中获取methodsession['k1'] = 'guhanzhe'  # LocalProxy对象的__setitem__(key=k1, value='guhanzhe')      # 先去ctx中拿到session,再给session中设置对应的值session['k1']               # LocalProxy对象的__getitem__(key='1')                       # 先去ctx中拿到session,再去session中获取对应的值return 'hello world~'if __name__ == '__main__':app.__call__app.run()

视图函数中有关于request和session的操作都是通过LocalProxy对象这个中介操作,然后再通过函数_lookup_req_object去ctx获取到request和session对象。

在这里插入图片描述

第三阶段:

pop肯定也不是直接pop的,也要走中介,如下图蓝色流程线:

在这里插入图片描述

但是上述所画几个流程图其实都不全,所以再来缕一遍源码:

进push:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这个AppContext对象中,又封装了两个值:app和g!

在这里插入图片描述

回退:

在这里插入图片描述

封装了那两个值后执行app_ctx.push(),再来看看app_ctx是啥?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

所以流程图又要更新了!这次多了个存放app(就是程序进来实例化的Flask对象)和g的对象!!!

完整画图:

在这里插入图片描述

上面刚说多了个g和app:
在这里插入图片描述

进去g:

在这里插入图片描述
在这里插入图片描述

进去current_app:
在这里插入图片描述

是不是和request和session一个流程!!!

最后来看看最后的最后:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

把最后的最后补充进图:

在这里插入图片描述

上面这个机制支持多线程!

Flask中一共有几个LocalStack和Local对象?

  • 都是两个~

相关文章:

(二十一)Flask之上下文管理第二篇(细细扣一遍源码)

每篇前言: 🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 🔥🔥本文已收录于Flask框架从入门到实战专栏:《Flask框架从入…...

Java项目:基于SSM框架实现的企业员工岗前培训管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm821基于ssm框架实现的企业员工岗前培训管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格…...

深入了解Redis:选择适用于你的场景的持久化方案

自然语言处理的发展 文章目录 自然语言处理的发展强烈推荐前言:Redis提供了几种主要的持久化方案:RDB快照持久化:工作原理: AOF日志文件持久化:混合持久化: 总结强烈推荐专栏集锦写在最后 强烈推荐 前些天…...

【Git配置代理】Failed to connect to github.com port 443 问题解决方法

前言: 在学习代码审计时,有时会需要使用git去拉取代码,然后就出现了如下错误 看过网上很多解决方法,觉得问题的关键还是因为命令行在拉取/推送代码时并没有使用VPN进行代理。 解决办法 : 配置http代理:…...

python提取word文档内容的示例

一、微软Word历史、背景: Word 的特异功能就是把那些应该写成简单的 TXT 或 PDF 格式的文件,变成了既大又慢且难以打开的怪兽,它们经常在系统切换和版本切换中出现格式不兼容,而且因为某些原因在文件内容已经定稿后仍处于可编辑的…...

MarkDown快速入门-以Obsidian编辑器为例

直接上图,左右对应。 首先是基础语法。 # 标题,几个就代表几级标题;* 单个是序号,两个在一起就是斜体;- [ ] 代表任务,注意其中的空格; 然后是表格按钮代码 | 使用中竖线代表表格&#xff0c…...

【计算机网络】协议,电路交换,分组交换

定义了在两个或多个通信实体之间交换的报文格式和次序,以及报文发送和/或接收一个报文或其他事件所采取的动作.网络边缘: 端系统 (因为处在因特网的边缘) 主机 端系统 客户 client服务器 server今天大部分服务器都属于大型数据中心(data center)接入网(access network) 指将端…...

加速应用开发:低代码云SaaS和源码交付模式如何选

随着数字化转型的加速,企业对于快速开发和交付高质量应用的需求也越来越迫切。为了满足这一需求,开发者们开始探索采用低代码平台进行软件开发工作,以加速应用开发过程。 目前,市场上的低代码产品众多,但基本可分为简单…...

ATT汇编

指令后缀 AT&T格式的汇编指令有不同的后缀 其中 b表示byte,字节 w表示word,字/两字节 l表示long,32位系统下的long是4字节 q表示quad,意味四重,表示4个字/8字节 寄存器用途 参见 AT&T的汇编世界 - Gemfield…...

java split 拆分字符串

今天突然把java里split 跟,kotlin中的split 弄混了 kotlin中split 的用法跟python 中的split 用法是一样的,java中由于返回值是String[] 的数组,所以 在使用的时候需要注意下返回值如果要获取里面的内容,还是需要遍历下里面的内…...

【InternLM 大模型实战】作业与笔记汇总

笔记1:https://blog.csdn.net/weixin_42567071/article/details/135375937 笔记2:https://blog.csdn.net/weixin_42567071/article/details/135423120 作业2:https://github.com/xiaomile/InternLM-homework/tree/main/%E4%BD%9C%E4%B8%9A1 笔…...

解析PreMaint在石油化工设备预测性维护领域的卓越表现

石油化工行业一直在寻找能够确保设备高效运行的先进维护解决方案。在这个领域,PreMaint以其卓越的性能和创新的技术引起了广泛关注。 一、为何选择预测性维护? 传统的维护方法,基于固定的时间表,无法灵活应对设备的真实运行状况。…...

C++面试宝典第25题:阶乘末尾零的个数

题目 给定一个整数n,返回n!(n的阶乘)结果尾数中零的个数。 示例 1: 输入:3 输出:0 解释:3! = 6,尾数中没有零。 示例 2: 输入:5 输出:1 解释:5! = 120,尾数中有1个零。 解析 这道题主要考察应聘者对于数学问题的分析和理解能力,以及在多个解决方案中,寻求最优…...

PCIE 4.0 Equalizaiton(LTSSM 均衡流程)

1. 均衡 在Tx端有FFE(Feed Forward Equalizer,前馈均衡器);在Rx端有:CTLE(Continuous Time Linear Equalizer,连续时间线性均衡器)和DFE(Decision Feedback Equalizer&a…...

[libwebsockets]lighttpd+libwebsockets支持ws和wss配置方法说明

libwebsockets介绍 libwebsockets是一款轻量级用来开发服务器和客户端的C库。它不仅支持ws,wss还同时支持http与https,可以轻轻松松结合openssl等库来实现ssl加密。 官方参考链接: https://libwebsockets.org/ lighttpd版本 lighttpd/1.4.59 (ssl) - a light and fast w…...

常用软件安装

服务器版本为Centos7.8 x86_64 1.yum下载提速 1.wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 2. yum clean all 3.yum makecache2.jdk yum install java-1.8.0-openjdk* -y # yum update 时自动更新jdk版本 1.yum -y install …...

翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二 1. 将任何静态图表转换为动态数据可视化 ChatGPT Vision 不仅可以将涂鸦变成功能齐全的 Streamlit 应用程序,还…...

Qt QPlainTextEdit高亮显示当前行

Qt QPlainTextEdit高亮显示当前行 文章目录 Qt QPlainTextEdit高亮显示当前行摘要错误的代码正确的代码QTextEdit::ExtraSelection 关键字: Qt、 QPlainTextEdit、 QTextBlock、 ExtraSelection、 GPT 摘要 今天要在说一下GPT,当下如果你还不会用G…...

Linux编辑器vim(含vim的配置)

文章目录 前言vim的基本概念vim基本操作进入vim模式切换退出vim vim指令vim命令模式指令vim底行模式命令 简单vim配置 前言 本篇文章,小编将介绍Linux编辑器–>vim以及vim的配置。 vim的基本概念 正常/普通/命令模式(Normal mode) 控制屏幕光标的移动&#xf…...

Oracle DG环境下的秘钥管理

今天有朋友问到1)DG环境下的秘钥管理需要注意什么,2)秘钥管理对DG的日志同步有影响吗? 对于2)的回答是明确的,没有影响。秘钥的管理和DG的redo log shipping完全是两套机制。在最新版的Oracle Key Vault常…...

接口测试中缓存处理策略

在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...