flask框架(下)

news2024/11/23 21:48:27

文章目录

  • flask框架(下)
    • werkzeug简介
    • 请求上下文
      • flask 处理方案
      • 回到 wsgi_app 方法中
      • push 源码
      • 总结
      • 补充

flask框架(下)

werkzeug简介

Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等

通过 查看 flask.run() 源码可以发现,实际上执行的也是 werkzeug 下的 run_simlpe 函数

在这里插入图片描述

如下一个demo 可以看出 run_simple() 做了些什么

from werkzeug.serving import run_simple
from werkzeug.wrappers import Request, Response

@Request.application
def app(req):
    print(req.method)    # GET
    print(req.path)     # /
    return Response('200 ok')

run_simple('0.0.0.0', 5000, app)

在这里插入图片描述

请求上下文

在django 中,每一个试图函数,都必需要接受一个request参数,才能执行试图函数,并且请求携带的参数也在request对象中,但是在flask 中,request 对象是一个全局对象,那么在多个请求过来时,flask是如何处理,才能在多线程条件下保证request对象携带参数是正确的?答案就在flask 的请求上下文管理中

flask 处理方案

入口还是在 app.run() 方法。

在 Flask 类中,可以发现重写的 __ call__ 方法。每当请求过来时,都会加括号执行app,因此都会自动执行__ call__方法。

在这里插入图片描述

继续往下,可以发现 wsgi_app 方法源码如下

在这里插入图片描述

继续往下,可以发现。request_context 实际上就是返回了 RequestContext 类的对象
在这里插入图片描述
在这里插入图片描述

回到 wsgi_app 方法中

在这里插入图片描述

push 源码

在这里插入图片描述
节约时间。下方直接 copy 参考博客截图。原文地址如下
_request_ctx_stack是LocalStack类的实例化对象:

在这里插入图片描述

LocalStack类中的__init__方法如下:
在这里插入图片描述

Local类的__init__方法如下:
在这里插入图片描述

get_ident是Local类所在文件中导入的一个方法名,该方法执行后会得到线程或协程ID,如下:
   在这里插入图片描述

LocalStack类中的top是一个属性方法,源码如下:
在这里插入图片描述

下一步Local类中的__getattr__方法源码如下:

在这里插入图片描述

到此,分析得出top = _request_ctx_stack.top中的top为None。

接下来分析 **_request_ctx_stack.push(self)**做了什么?LocalStack类中的push方法源码如下:

在这里插入图片描述

Local类中的__setattr__方法源码如下:

在这里插入图片描述

因为rv.append(obj),所以最后LocalStack对象,即_request_ctx_stack对象字典化后如下:

{'_local':{'__storage__':{9527:{stack:[ctx]}}, '__ident_func__':get_ident}}
# 说明:9527假设是获取到的线程或者协程号,ctx包含request对象和session对象。

到此,flask请求上文结束,也就是完成了将一个request和session对象存储到某个地方。

总结

1.  请求来时,flask 会把档次请求对象 request 放到 local 对象中,每个请求都是一个线程
	local对象实际管理的就是一个字典,里面以线程或者协程id为key,请求对象为value 值
2.  使用时,会根据 key 到 local 对象中取值,确保携带的值不会出错
3.  请求结束,flask 会把 该次 request 对象从local中移除
4.  g 对象和 session 也是采用上述相同处理。

补充

在阅读过程中发现,request对象,session和g对象都是同一个类 LocalProxy的对象,

在这里插入图片描述

LocalProxy类是个代理类, 重写了所有的魔法方法。来我们在使用时,request,session,g对象的属性打印出来的属性不一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/366323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Stream、File、IO 超详细整理,适合新手入门

目录 Java Stream Java File Java IO Java Stream Java Stream 是 Java 8 中引入的一种新的抽象数据类型,它允许开发人员使用函数式编程的方式来处理集合数据。 使用 Java Stream 可以方便地进行过滤、映射、排序和聚合等操作。下面是一个简单的示例:…

10分钟快速入门Pandas库

pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的,这篇文章主要介绍了10分钟快速入门Pandas库,重点介绍pandas常见使用方法,结合实例代码介绍的非常详细,需要的朋友可以参考下目录Pandas的介绍pandas 是基于Num…

其实一点不难学会这三步一定让你学会制作一个『3D建模』大屏

上次已经教过大家怎样制作一个简单的2D数据可视化大屏~那有一些朋友们就会说那些炫酷的3D可视化大屏是怎样制作的呢?这不就来了,今天就教大家怎样用山海鲸可视化软件制作一个带3D建模的可视化大屏,并且最重要的是无需会特别复杂的3D建模知识。…

数据结构与算法之爬楼梯动态规划

一.题目(爬楼梯)假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬…

playQueue 和 segmentQueue解析

文章目录 前提分析时序图常见问题结论前提 一个playlist有4段每段大概2秒每段走http下载大概500ms每段大小500KB左右分析时序图 如果网络情况很理想的话,基本上一直保持在playQueue为4,segmentQueue为1。如果网络特别差的情况下,基本上playQueue为1,segmentQueue为4。当网络…

中科检测赴中科院广州电子CASAIM开展座谈会,围绕3D打印、三维扫描和精密测量展开深入交流

2月9日,中科检测技术服务(广州)股份有限公司(简称:中科检测)一行到访中科院广州电子技术有限公司,参观广东省增材制造工程实验室和三维扫描及精密测量重点实验室,就3D打印、三维扫描和精密测量相关技术内容…

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A(7)

目录 模块A 基础设施设置与安全加固 一、项目和任务描述: 二、服务器环境说明 三、具体任务(每个任务得分以电子答题卡为准) A-1任务一:登录安全加固 1.密码策略(Windows,Linux) a.设置最…

2023年排名前茅的十大饭店装修设计!

相信大家都是知道的,饭店装修设计其实是一门很深的学问,只有掌握这门学问才能够打造出来精美的空间,因此饭店装修必须要有专业餐饮设计公司的设计师进行设计。但是在国内饭店装修设计公司那么多,饭店老板要如何选择呢?…

C语言--指针进阶1

目录回顾字符指针指针数组数组指针&数组名和数组名的区别数组指针的使用指针作为形参练习数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参回顾 指针的内容,我们在初级阶段已经有所涉及了,我们先来复习一下 指针就是个变量&am…

关于举办2023年中国可持续塑料峰会的通知

根据麦肯锡报道,如果塑料需求按照目前的趋势发展,到2030年,全球塑料废物量将从2016年的每年2.6亿吨增加到每年4.6亿吨,使已经严重的环境问题上升到一个全新的水平。目前世界塑料年产量超过3亿吨,为社会生产生活带来巨大…

数据结构与算法之最短路路径与最短路径和动态规划

If every unfolding we experience takes us further along in life, then, we are truly experiencing what life is offering.如果我们在人生中体验的每一次转变都让我们在生活中走得更远,那么,我们就真正的体验到了生活想让我们体验的东西。Do not tr…

【Java|golang】 1238. 循环码排列---格雷编码

给你两个整数 n 和 start。你的任务是返回任意 (0,1,2,…,2^n-1) 的排列 p,并且满足: p[0] start p[i] 和 p[i1] 的二进制表示形式只有一位不同 p[0] 和 p[2^n -1] 的二进制表示形式也只有一位不同 示例 1: 输入:n 2, start …

Linux基础命令-netstat显示网络状态

文章目录 netstat 命令介绍 语法格式 基本参数 显示各列内容分析 1)netstat -a显示各列内容分析 2)netstat -r显示各列内容分析 3)netstat -i 显示各列内容分析 参考实例 1)显示系统网络状态的所有连接 2)…

Kubernetes之探针probe

deployment只保证pod的状态为running。如果pod状态是running,但是里面丢失了文件,导致用户不能访问数据,则deployment是不管用的,此时就需要probe来检测pod是否正常工作。 probe是定义在容器里的,可以理解为容器里加的…

python基于vue品牌首饰售卖平台

可定制框架:ssm/Springboot/vue/python/PHP/小程序/安卓均可开发目录 开发语言:Python python框架:django/flask 软件版本:python 数据库:mysql 数据库工具:Navicat11 开发软件:PyCharmscode 项目介…

每日学术速递2.22

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.PriSTI: A Conditional Diffusion Framework for Spatiotemporal Imputation 标题:PriSTI:时空插补的条件扩散框架 作者:Mingzhe Liu, Han Huan…

mysql学习(复习)总结 - 索引机制及分类

mysql索引机制及分类1、索引简介2、索引机制2.1 红黑树(平衡二叉树)2.2 哈希2.3 平衡多路查找树(B-Tree)2.4 Btree2.5 不同数据结构的索引对比3、索引分类3.2 存储分类-聚簇、二级(辅助)索引3.2.1 聚簇(集)索引3.2.1.1 定义3.2.1.2 聚集索引的适用情形3.…

计算机网络(五):三次握手和四次挥手,TCP,UDP,TIME-WAIT,CLOSE-WAIT,拥塞避免,

文章目录零. TCP和UDP的区别以及TCP详解TCP是如何保证可靠性的TCP超时重传的原理TCP最大连接数限制TCP流量控制和拥塞控制流量控制拥塞控制TCP粘包问题一、三次握手和四次挥手二、为什么要进行三次握手?两次握手可以吗?三、为什么要进行四次挥手&#xf…

23.2.23 22湖北省赛 B

好久没打卡了, 随便找的个水题写 这题是简单难度的 ab1 所以可以找到固定规律, 通过手动模拟可以发现 假设两种水叫做a水和b水 先倒入a水 1:0 倒入b水 1:1 此时水杯为 倒出一半的混合物, 因为ab水互溶, 比例不变 再加入a水或者b水将容器填满 比例现在变为 3:1 混合之后再…

一文让你了解Docker的前世今生

Docker概述 Docker为什么会出现? 我们在开发一款产品的过程中一定是需要至少两套环境的:开发和生产。现在更多的公司都是在使用开发、测试、生产三套环境,我们对不同环境的配置和打包都是非常繁琐和复杂的,而且重复度很高&#…