1. Requests库简介

书籍是人类进步的阶梯,源码是程序员进步的阶梯。为了进步,我们就要不断地阅读源码,提升自己的技术水平。今天我们来剖析一下Python的Requests库。

Requests库是Python代码中用来发送HTTP请求非常好用的一个库。引用其作者的话说是:HTTP for Humans。以前在开发过程中也使用过Requests库,感觉确实很好用。源码之前,了无秘密,所以今天我们就来分析一下其源码,看看Requests这么好用的秘密。

本文主要分为以下几个内容:

1.Requests库源码的目录结构

2.Requests库请求流程

3.Requests库中重要的类分析

4.Requests库分析总结

2. Requests库源码目录结构

各个文件作用:

文件名

作用

__init__.py

import了对外暴露的变量名称

检查urllib3,chardet,cryptography

库的版本

silent了urllib3的DependencyWarning

设置logging信息。

__version__.py

定义了版本信息等变量

_internal_utils.py

定义to_native_string
和unicode_is_ascii两个工具函数

adpaters.py

HTTPAdapter,发送HTTP请求使用的接口。

api.py

定义了requests库全部的api接口,get,post,head,put,delete,option,patch,request。其中request为其他api函数的统一入口。

auth.py

定义BaseAuth,HTTPAuth等类。

certs.py

返回默认的CA certificate bundle

compat.py

兼用python2和python3,将一些模块import后进行统一命名,使得代码统一。

cookies.py

包含处理cookies的工具函数和Mock类

exceptions.py

定义了requests库中的各个异常类。

help.py

生成help信息。

hooks.py

定义default_hooks{‘response’: []}

以及dispatch_hook函数。

models.py

定义和Request,PreparedRequest,Response等最重要的三个类。分别对应这原始请求对象,要发送的请求对象,Server的返回响应对象。

pacakages.py

将这三个库urllib3, idna, chardet重新引入sys.modules[requests.package.mod]。

sessions.py

定义了Session类,对requests库所有请求进行管理。

status_code.py

定义codes全局变量,http返回码的dict,便于使用文本来查找数字。在__init函数中将_code字典中定义的数字与字符串对应关系转成可以通过字符串来找数字的codes对象类型为LookupDict。可以通过codes的attribute和item来查找。

structures.py

定义CaseInsensitiveDict继承自OrderedDict和LookupDict继承自dict。

utils.py

包含很多工具函数。

3. Requests库请求流程

一个HTTP请求的请求流程非常简单,如下图所示:

3.1. Request请求详细流程

3.2. PreparedRequest对象Prepare原始请求的过程

将原始请求中的各种参数进行规范化处理

3.3. HTTPAdapter的send发送请求过程

requests库实际是利用urllib3库的PoolManager来发送请求的。对直接发送请求与chunked发送请求者两种方式,做了不同的处理方式。PoolManager实际上对于请求同一个Host的请求在底层的连接是会复用的。

4. 重要的类分析

4.1. Session类

维护请求的发送以及请求的关闭,实现了__enter__和__exit__可以在with上下文管理器中使用。免去使用者手动关闭连接的烦恼。同时使用Session类可以将请求中的参数合并到Session类的成员变量中。是的请求的参数在整个Session中都可以使用。

4.2. Request类

存放用户发起HTTP请求的原始请求参数

4.3. PreparedRequest类

规范化HTTP请求的内容

4.4. Response类

封装了urllib3返回的结果,同时Response类中还包含了PreparedRequest请求的内容,使得使用者可以很容易获取请求的Request内容。

4.5. HTTPAdapter

在Requests库发送HTTP请求时,实际是使用BaseAdapter的send函数来进行的。HTTPAdapter继承自BaseAdapter类,这为用户使用Requests库时提供了扩展Adapter的能力,可以对请求过程进行定制,有利于程序的扩展。

5. Requests库分析总结

从对源码的分析过程中,我们可以看出,Requests库发送HTTP请求的流程是比较简单与直接的。这个库最大的优点就在于它为用户提供了一个非常简单的接口,对于使用者来说真的非常友好。

Request库底层利用了urllib3这个库,来真正完成HTTP请求连接池的管理和请求发送的功能,同时还预留了一些扩展的余地。这个库实际上是站在巨人的肩膀上,很好地利用了已有的轮子来实现自己的功能。

Python Requests库源码分析相关推荐

  1. 彻底弄懂Python标准库源码(一)—— os模块

    目录 第1~22行 模块整体注释.nt与posix 第24~46行 模块引入._exists方法._get_exports_list方法 第48~97行 根据系统不同导入不同的方法和属性 第100~1 ...

  2. 《微信小程序-进阶篇》Lin-ui组件库源码分析-列表组件List(一)

    大家好,这是小程序系列的第二十篇文章,在这一个阶段,我们的目标是 由简单入手,逐渐的可以较为深入的了解组件化开发,从本文开始,将记录分享lin-ui的源码分析,期望通过对lin-ui源码的学习能加深组 ...

  3. Android主流三方库源码分析(九、深入理解EventBus源码)

    一.EventBus使用流程概念 1.Android事件发布/订阅框架 2.事件传递既可用于Android四大组件间通信 3.EventBus的优点是代码简洁,使用简单,事件发布.订阅充分解耦 4.首 ...

  4. surprise库源码分析

    最近工作上需要使用到协同过滤,来计算相似度,因此根据https://blog.csdn.net/weixin_43849063/article/details/111500236的步骤对surpris ...

  5. sigslot库源码分析

    言归正传,sigslot是一个用标准C++语法实现的信号与槽机制的函数库,类型和线程安全.提到信号与槽机制,恐怕最容易想到的就是大名鼎鼎的Qt所支持的对象之间通信的模式吧.不过这里的信号与槽虽然在概念 ...

  6. 【python】Dpark源码分析

    关于Dpark的PDF: http://velocity.oreilly.com.cn/2011/ppts/dpark.pdf 源码分析: Dpark/Spark中最重要的核心就是RDD(弹性分布式数 ...

  7. python库源码分析_python第三方库Faker源码解读

    源码背景 Faker是一个Python第三方库,GITHUB开源项目,主要用于创建伪数据创建的数据包含地理信息类.基础信息类.个人账户信息类.网络基础信息类.浏览器信息类.文件信息类.数字类 文本加密 ...

  8. cJSON库源码分析

    cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的Json格式解析库. 那什么是Json格式?这里照搬度娘百科的说法: Json(JavaScript Object Notat ...

  9. Python Sklearn库源码学习--kmeans

    前言: 分析体检数据希望不拘泥于Sklearn库中已有的聚类算法,想着改一下Kmeans算法.本着学习的目的,现在开始查看sklearn的源代码.希望能够写成一个通用的包. 有必要先交代一下我使用的p ...

最新文章

  1. 用物理学来为生命技术及制度的演化找出规律-读《为什么世界不会失控》
  2. [转载].怎样在有限状态机中延时
  3. UBOOT问题收集(1)--balignl 16, 0xdeadbeef
  4. VB讲课笔记13:二级公共基础
  5. Klevgrand DAW LP for Mac(乙烯基唱片播放器模拟插件)
  6. 服务器定时备份数据库 执行文件
  7. WIN32_FIND_DATA详解
  8. 网吧收银系统无法连接服务器失败,网吧收银系统pubwin修复网吧数据库出现一致性错误方法.docx...
  9. 黑金花大理石_不同产地的黑金花大理石有哪些特点?
  10. 最详细的Extmail安装文档
  11. 必应每日一图php,轻量必应每日一图HTML源码
  12. 学计算机的人可以定位找人吗,电脑如何实现查找“附近的人”?
  13. ocx找不到指定模块
  14. “双一流”哈尔滨工程大学成立人工智能有关学院,打造一流学科群!
  15. 华为防火墙做单臂路由_华为单臂路由配置实例
  16. converting to execution character set: Illegal byte sequence
  17. linux系统安装(CentOS 7) 和软件安装(mysql,tomcat,jdk)
  18. 多路温度采集控制系统(1)项目介绍
  19. 车载服务器作用,穿针引线谈铁路机车车载系统服务器
  20. 画仓鼠大赛 评比开始!

热门文章

  1. 通过ICMP协议判断一个IP是否可达
  2. Win11任务栏里华为电脑管家图标重叠怎么办?
  3. 在 Cydia 商店上购买收费软件教程
  4. android 加载dwg 图纸解决方案
  5. OO设计原则 -- OO设计的原则及设计过程的全面总结
  6. vue中element ui 中tree组件怎么自定义前缀图标呢?
  7. Halcon、opencv与C++的图像数据转换
  8. axb_2019_fmt64
  9. ThreadingTest软件测试界顶层设计--由中国人引领的数字化软件测试时代来了
  10. 简单的摩尔斯电码(又译为摩斯电码)