位置: 编程技术 - 正文

从源码解析Python的Flask框架中request对象的用法(python源码分析工具)

编辑:rootadmin

推荐整理分享从源码解析Python的Flask框架中request对象的用法(python源码分析工具),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python源码分析工具,python源码深度剖析,python源码剖析百度云,python源码深度剖析,pytorch源码解析,python3源码剖析,python3源码剖析,python3源码剖析,内容如对您有帮助,希望把文章链接给更多的朋友!

from flask import requestFlask 是一个人气非常高的Python Web框架,笔者也拿它写过一些大大小小的项目,Flask 有一个特性我非常的喜欢,就是无论在什么地方,如果你想要获取当前的request对象,只要 简单的:从当前request获取内容:

method: 起始行,元数据 host: 起始行,元数据 path: 起始行,元数据 environ: 其中的 SERVER_PROTOCOL 是起始行,元数据 headers: 头,元数据 data: body, 元数据 remote_addr: 客户端地址 args: 请求链接中的参数(GET 参数),解析后 form: form 提交中的参数,解析后 values: args 和 forms 的集合 json: json 格式的 body 数据,解析后 cookies: 指向 Cookie 的链接

Request 对象对参数的分类很细,注意 args, form, valeus, json 的区别。当然最保险也最原始的方式就是自己去解析 data。

另一个需注意的地方是某些属性的类型,并不是 Python 标准的 dict ,而是 MultiDict 或者 CombinedMultiDict。这是为了应对 HTTP 协议中参数都是可重复的这点而做的设定。因此取值的时候要注意这些对象的特性,比如 .get() 和 .get_list() 方法返回的东西是不同的。非常简单好记,用起来也非常的友好。不过,简单的背后藏的实现可就稍微有一些复杂了。 跟随我的文章来看看其中的奥秘吧!

两个疑问?在我们往下看之前,我们先提出两个疑问:

疑问一 : request ,看上去只像是一个静态的类实例,我们为什么可以直接使用request.args 这样的表达式来获取当前request的args属性,而不用使用比如:

这样的方式呢?flask是怎么把request对应到当前的请求对象的呢?

疑问二 : 在真正的生产环境中,同一个工作进程下面可能有很多个线程(又或者是协程), 就像我刚刚所说的,request这个类实例是怎么在这样的环境下正常工作的呢?

要知道其中的秘密,我们只能从flask的源码开始看了。

源码,源码,还是源码首先我们打开flask的源码,从最开始的__init__.py来看看request是怎么出来的:

我们可以看到flask的request是从globals.py引入的,而这里的定义request的代码为 request = LocalProxy(partial(_lookup_req_object, 'request')) , 如果有不了解 partial是什么东西的同学需要先补下课,首先需要了解一下 partial 。

不过我们可以简单的理解为 partial(func, 'request') 就是使用 'request' 作为func的第一个默认参数来产生另外一个function。

所以, partial(_lookup_req_object, 'request') 我们可以理解为:

从源码解析Python的Flask框架中request对象的用法(python源码分析工具)

生成一个callable的function,这个function主要是从 _request_ctx_stack 这个LocalStack对象获取堆栈顶部的第一个RequestContext对象,然后返回这个对象的request属性。

这个werkzeug下的LocalProxy引起了我们的注意,让我们来看看它是什么吧:

看前几句介绍就能知道它主要是做什么的了,顾名思义,LocalProxy主要是就一个Proxy, 一个为werkzeug的Local对象服务的代理。他把所以作用到自己的操作全部“转发”到 它所代理的对象上去。

那么,这个Proxy通过Python是怎么实现的呢?答案就在源码里:

事情到了这里,我们在文章开头的第二个疑问就能够得到解答了,我们之所以不需要使用get_request() 这样的方法调用来获取当前的request对象,都是LocalProxy的功劳。

LocalProxy作为一个代理,通过自定义魔法方法。代理了我们对于request的所有操作, 使之指向到真正的request对象。

怎么样,现在知道了 request.args 不是它看上去那么简简单单的吧。

现在,让我们来看看第二个问题,在多线程的环境下,request是怎么正常工作的呢? 还是让我们回到globals.py吧:

问题的关键就在于这个 _request_ctx_stack 对象了,让我们找到LocalStack的源码:

通过这些分析,相信疑问二也得到了解决,通过使用了当前的线程/协程ID,加上重载一些魔法 方法,Flask实现了让不同工作线程都使用了自己的那一份stack对象。这样保证了request的正常 工作。

说到这里,这篇文章也差不多了。我们可以看到,为了使用者的方便,作为框架和工具的开发者 需要付出很多额外的工作,有时候,使用一些语言上的魔法是无法避免的,Python在这方面也有着 相当不错的支持。

我们所需要做到的就是,学习掌握好Python中那些魔法的部分,使用魔法来让自己的代码更简洁, 使用更方便。

但是要记住,魔法虽然炫,千万不要滥用哦。

Python中的Descriptor描述符学习教程 Descriptor是什么?简而言之,Descriptor是用来定制访问类或实例的成员的一种协议。额。。好吧,一句话是说不清楚的。下面先介绍一下Python中成员变量的

深入理解Python变量与常量 变量是计算机内存中的一块区域,变量可以存储规定范围内的值,而且值可以改变。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可

Python黑魔法Descriptor描述符的实例解析 在Python中,访问一个属性的优先级顺序按照如下顺序:1:类属性2:数据描述符3:实例属性4:非数据描述符5:__getattr__()方法这个方法的完整定义如下所示:def__ge

标签: python源码分析工具

本文链接地址:https://www.jiuchutong.com/biancheng/386944.html 转载请保留说明!

上一篇:Python搭建APNS苹果推送通知推送服务的相关模块使用指南(python搭建平台)

下一篇:Python中的Descriptor描述符学习教程(Python中的除号)

  • 个人所得税中应纳税所得额高好还是低好
  • 印花税一般计入管理费用
  • 契税是什么样的单子
  • 关税是价内税还是税外税
  • 防伪税控系统专用设备
  • 股权投资公司属于金融企业吗
  • 主营业务收入体现在资产负债表哪里
  • 所得税汇算清缴分录怎么做
  • 小微企业季报
  • 承包费收入如何入账
  • 冲减以前年度主营业务成本对今年有影响吗
  • 应纳税额滞纳金
  • 分类账和明细账平行登记规则
  • 工程预付款的规定
  • 物业公司收入需要公示
  • 研发支出是什么性质的科目
  • 单位车辆卖给个人怎么开票
  • 遗失发票如何处理
  • 公司出租房屋交印花税吗
  • 开专用发票可以不写单位与型号么?
  • 小规模纳税人3%减按1%的账务处理
  • 集团内部股权无偿划转引起资本公积增加需要印花税
  • 筹建期可以有收入吗
  • 小规模印花税减免性质代码怎么填
  • 企业对外捐赠现金的会计处理
  • 生产车间的窗帘怎么处理
  • 企业控股情况是指
  • 什么是电子发票图片
  • 政府补助调增还是调减
  • 管理费用怎么结转分录
  • win11电脑屏幕倒过来了怎么办
  • 金融资产终止确认是什么意思
  • dxva2.dll是什么意思
  • 贷款滞纳金如何收取
  • 人民币账户购汇支付
  • Java8 Stream流Collectors.toMap当key重复时报异常(IllegalStateException)
  • php是面向过程还是面向对象
  • 若依框架使用教程
  • php获取随机数
  • 正版菜狗
  • net命令详解步骤
  • 借贷公司借钱给别的公司需要开什么会
  • 你用python做什么
  • SQL Server中TRUNCATE事务回滚操作方法
  • 其他应付款贷方正数表示什么意思
  • 资金占用费的税费是多少
  • 纳税人应按照当期可抵扣进项税额的10%
  • 新会计准则规定
  • 房屋租赁水电费计入什么科目
  • 公司跟个体户的税收
  • 哪些原始凭证要盖章
  • 营改增会计分录怎么做
  • 支付的中介费进什么科目
  • 销售货物收到托运怎么办
  • 小企业如何进行内部创新
  • 无形资产内部研究开发支出的处理
  • 服务外包离岸业务是什么
  • 个体工商户的纳税标准
  • 发票入账但是没付款有什么税务风险
  • 注册公司好麻烦
  • 工商联络注册
  • sql server分组查询
  • sql2000语句
  • linux安装.sh
  • vc运行程序exe停止工作
  • Windows 8.1 with Update MSDN简体/繁体中文原版下载地址与安装密匙
  • win8如何安装win10系统
  • RadioSvr.EXE - RadioSvr是什么进程 有什么用
  • 苹果mac 最新系统
  • 惠普笔记本重装系统后没有无线连接
  • windows视频截屏
  • javascript date函数
  • jquery浮动窗口
  • windows批处理命令脚本
  • Vuforia 4.0 beta——Object Recognition (三)
  • jquery过滤选择器按照过滤规则分类包括?
  • First Class: UI of Android
  • 个税申报网上操作步骤
  • 住房公积金交纳的原则
  • 企业的赞助费如何入账
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设