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

深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!

🔸 第一部分:requests库的入口

我们从requests库的入口开始,通常我们会使用 requests.get()requests.post() 等方法发送HTTP请求。那么,这些方法背后究竟做了些什么呢?我们从requests.get()方法开始看起:

# requests/__init__.py
def get(url, params=None, **kwargs):"""Sends a GET request."""return request('get', url, params=params, **kwargs)

🔹 requests.get() 实际上是调用了内部的 request() 方法,并将 'get' 作为请求方法传入。让我们进一步深入 request() 方法。


🔸 第二部分:request方法揭秘

requests库中,request() 方法负责构建和发送所有类型的HTTP请求:

# requests/api.py
def request(method, url, **kwargs):session = sessions.Session()return session.request(method=method, url=url, **kwargs)

🔹 request() 方法创建了一个 Session 对象,然后调用了 session.request()。这意味着实际的请求处理是由 Session 对象完成的。


🔸 第三部分:Session对象的奥秘

Session 对象在requests库中扮演了重要角色。它不仅可以发送请求,还能保存cookie等会话信息:

# requests/sessions.py
class Session(SessionRedirectMixin, RequestHookMixin):def request(self, method, url, params=None, data=None, headers=None, cookies=None, files=None, auth=None, timeout=None, allow_redirects=True, proxies=None, hooks=None, stream=None, verify=True, cert=None, json=None):prep = self.prepare_request(Request(method=method, url=url, headers=headers, files=files, data=data, json=json, params=params, auth=auth, cookies=cookies, hooks=hooks))...send_kwargs = {'timeout': timeout, 'allow_redirects': allow_redirects, 'proxies': proxies, 'stream': stream, 'verify': verify, 'cert': cert, 'hooks': hooks}...resp = self.send(prep, **send_kwargs)return resp

🔹 Session 对象的 request() 方法中首先调用 prepare_request() 方法来构建 Request 对象。然后调用 send() 方法来发送请求。


🔸 第四部分:Request对象的构建

prepare_request() 方法负责构建一个 Request 对象:

# requests/sessions.py
def prepare_request(self, request):p = PreparedRequest()p.prepare(method=request.method.upper(),url=request.url,files=request.files,data=request.data,json=request.json,headers=request.headers,params=request.params,auth=request.auth,cookies=request.cookies,hooks=request.hooks,)return p

🔹 prepare_request() 方法中调用了 PreparedRequest 类,并通过其 prepare() 方法将请求的各个部分准备好。


🔸 第五部分:PreparedRequest的准备

PreparedRequest 类是用来标准化和准备请求数据的:

# requests/models.py
class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):def prepare(self, method=None, url=None, headers=None, files=None, data=None, params=None, auth=None, cookies=None, hooks=None, json=None):self.prepare_method(method)self.prepare_url(url, params)self.prepare_headers(headers)self.prepare_body(data, files, json)self.prepare_auth(auth, url)self.prepare_cookies(cookies)self.prepare_hooks(hooks)

🔹 PreparedRequest 类的 prepare() 方法中,分别调用了一系列 prepare_* 方法来准备HTTP请求的各个部分,如方法、URL、头信息、请求体等。


🔸 第六部分:发送请求

当请求准备好后,Session 对象的 send() 方法负责实际发送HTTP请求:

# requests/sessions.py
def send(self, request, **kwargs):...r = adapter.send(request, **kwargs)...return r

🔹 send() 方法中最重要的一步是调用 adapter.send() 方法,这里的 adapterHTTPAdapter 对象,它负责底层的HTTP请求发送。


🔸 第七部分:HTTPAdapter的发送

HTTPAdapter 对象的 send() 方法通过底层库(如urllib3)来实际发送请求:

# requests/adapters.py
class HTTPAdapter(BaseAdapter):def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):conn = self.get_connection(request.url, proxies)...resp = conn.urlopen(method=request.method,url=request.url,body=request.body,headers=request.headers,...)return self.build_response(request, resp)

🔹 send() 方法通过 get_connection() 方法获取一个连接,然后使用 conn.urlopen() 发送请求,并调用 build_response() 方法构建响应对象。


🔸 第八部分:构建响应

build_response() 方法负责将底层响应对象转换为 requestsResponse 对象:

# requests/adapters.py
def build_response(self, request, resp):response = Response()response.status_code = resp.statusresponse.headers = CaseInsensitiveDict(resp.headers)response.raw = respresponse.url = request.urlresponse.request = requestresponse.connection = selfreturn response

🔹 build_response() 方法中,将底层响应对象的状态码、头信息、URL等信息赋值给 Response 对象,从而完成响应构建。


🔸 总结

🔹 通过以上解析,我们了解了 requests 库从发送请求到接收响应的全过程。从 requests.get() 方法开始,经过 Session 对象的处理、PreparedRequest 的准备、HTTPAdapter 的发送,最终构建 Response 对象。这一系列流程确保了 requests 库能够简洁、高效地处理HTTP请求,让开发者可以专注于业务逻辑的实现。

希望通过这次源码解析,大家对 requests 库有了更深入的理解,能够更好地运用它进行网络请求处理! 🚀

相关文章:

深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!

🔸 第一部分:requests库的入口 我们从requests库的入口开始,通常我们会使用 requests.get() 或 requests.post() 等方法发送HTTP请求。那么,这些方法背后究竟做了些什么呢?我们从requests.get()方法开始看起&#xff…...

day1 服务端与消息编码

文章目录 消息的序列化与反序列化通信过程服务端的实现main 函数(一个简易的客户端) 本文代码地址: 本文是7天用Go从零实现RPC框架GeeRPC的第一篇。 使用 encoding/gob 实现消息的编解码(序列化与反序列化)实现一个简易的服务端,仅接受消息&#xff0c…...

部署WMS仓储管理系统项目后的注意事项

在探讨现代WMS仓储管理系统的部署与运营时,我们不得不深入剖析其背后的多维度考量与策略,以确保这一核心系统能够无缝融入并推动企业的整体供应链优化。WMS仓储管理系统作为连接仓库内部操作与外部供应链的桥梁,其重要性不言而喻,…...

跨网段 IP 地址通信故障分析

现如今计算机网络的规模和复杂性不断增加,跨网段通信成为网络运行中的常见需求。但如果设备处于不同网段且路由设置出现偏差时就会导致通信故障,严重影响网络的正常运行和数据传输。 1.跨网段通信的基本原理 跨网段通信依赖于路由器的路由功能。路由器根…...

存储引擎MySQL和InnoDB(数据库管理与高可用)

1、存储引擎 存储引擎是核心组成部分, 是构成数据库最基础最底层的部件, 利用这个部件,你的Mysql能够对数据进行查询、创建、更新、删除等操作, 也就是说,用户所输入的一系列的mysql语句,是由存储引擎来…...

探索局域网传输新境界 | 闪电藤 v2.2.7

在这个数字化时代,文件的快速、安全传输是我们日常工作中不可或缺的一部分。今天,电脑天空向大家介绍一款革命性的局域网文件传输工具——闪电藤,它将彻底改变你的文件传输体验。 🎨 界面设计 —— 极简之美 闪电藤采用极简的设…...

Tiling Window Management

我主要说一下windows版的 下面这个链接用的人比较多 GitHub - LGUG2Z/komorebi: A tiling window manager for Windows 🍉 建议搭配 GitHub - da-rth/yasb: A highly configurable cross-platform (Windows) status bar written in Python. GitHub - amnweb/ya…...

9. kubernetes资源——pv/pvc持久卷

kubernetes资源——pv/pvc持久卷 一、volume数据卷1、hostPath2、挂载nfs实现持久化 二、pv/pvc 持久卷/持久卷声明1、pv/pvc介绍2、pv/pvc的使用流程2.1 创建pv2.2 创建pvc2.3 创建pod,使用pv做持久化 一、volume数据卷 用于pod中的数据的持久化存储 支持很多的卷…...

2024西安铁一中集训DAY27 ---- 模拟赛((bfs,dp) + 整体二分 + 线段树合并 + (扫描线 + 线段树))

文章目录 前言时间安排及成绩题解A. 倒水(bfs dp)B. 让他们连通(整体二分 按秩合并并查集 / kruskal重构树)C. 通信网络(线段树合并 二分)D. 3SUM(扫描线 线段树) 前言 T1没做出…...

STM32F401VET6 PROTEUS8 ILI9341 驱动显示及仿真

stm32cubemx新建工程代码&#xff0c;并生成工程 设置gpio 设置SPI 其他的参考stm32默认设置 然后编辑驱动代码 ili9341.h #ifndef ILI9341_H #define ILI9341_H#include <stdbool.h> #include <stdint.h>#include "glcdfont.h" #include "stm32…...

抖音视频素材网站有哪些?非常好用的5个抖音视频素材库分享

在打造引人入胜的抖音视频时&#xff0c;选择高品质的视频素材至关重要。优选的素材不仅能够显著提升视频的吸引力&#xff0c;还能让你的作品在众多视频中突出重围。对于抖音创作者而言&#xff0c;让我们探索一些备受推崇的视频素材平台&#xff0c;帮助你制作出既专业又引人…...

【数据结构】链式二叉树的实现和思路分析及二叉树OJ

【数据结构】链式二叉树的实现和思路分析及二叉树OJ &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;数据结构 文章目录 【数据结构】链式二叉树的实现和思路分析及二叉树OJ前言一.链式二叉树的定义及结构二.链式二叉树的遍历2.1前序遍历2.2中…...

项目成功秘诀:工单管理系统如何加速进程

国内外主流的10款项目工单管理系统对比&#xff1a;PingCode、Worktile、浪潮云工单管理系统、华为企业智能工单系统、金蝶云苍穹、紫光软件管理系统、Jira、Asana、ServiceNow、Smartsheet。 在管理日益复杂的个人项目时&#xff0c;找到一款能够真正符合需求的管理软件&#…...

OpenGauss和GaussDB有何不同

OpenGauss和GaussDB是两个不同的数据库产品&#xff0c;它们都具有高性能、高可靠性和高可扩展性等优点&#xff0c;但是它们之间也有一些区别和相似之处。了解它们之间的关系、区别、建议、适用场景和如何学习&#xff0c;对于提高技能和保持行业敏感性非常重要。本文将深入探…...

星环科技携手东华软件推出一表通报送联合解决方案

随着国家金融监督管理总局“一表通”试点工作的持续推进&#xff0c;星环科技携手东华软件推出了基于星环科技分布式分析型数据库ArgoDB和大数据基础平台TDH的一表通报送联合解决方案&#xff0c;并已在多地实施落地中得到充分验证。 星环科技与东华软件作为战略合作伙伴&…...

YOLOv10环境搭建、训练自己的目标检测数据集、实际验证和测试

1 环境搭建 1.1 在官方仓库的给定的使用python3.9版本&#xff0c;则使用conda创建对应虚拟环境。 conda create -n yolov10 python3.9 1.2 切换到对应虚拟环境 conda activate yolov10 1.3 在指定目录下克隆yolov10官方仓库代码 git clone https://github.com/THU-MIG/yo…...

Harmony Next -- 通用标题栏:高度自定义,可设置沉浸式状态,正常状态下为:左侧返回、居中标题,左中右均可自定义视图。

hm_common_title_bar OpenHarmony三方库中心仓&#xff1a;https://ohpm.openharmony.cn/#/cn/detail/common_title_bar 介绍 一款通用标题栏&#xff0c;支持高度自定义&#xff0c;可设置沉浸式状态&#xff0c;正常状态下为&#xff1a;左侧返回、居中标题&#xff0c;左…...

甄选范文“论数据分片技术及其应用”软考高级论文,系统架构设计师论文

论文真题 数据分片就是按照一定的规则,将数据集划分成相互独立、正交的数据子集,然后将数据子集分布到不同的节点上。通过设计合理的数据分片规则,可将系统中的数据分布在不同的物理数据库中,达到提升应用系统数据处理速度的目的。 请围绕“论数据分片技术及其应用”论题…...

【elementui】记录el-table设置左、右列固定时,加大滚动条宽度至使滚动条部分被固定列遮挡的解决方法

当前elementui版本&#xff1a;2.8.2 现象&#xff1a;此处el-table__body-wrapper默认的滚动条宽度为8px&#xff0c;我加大到10px&#xff0c;如果不设置fixed一切正常&#xff0c;设置fixed后会被遮挡一点 el-table__fixed-right::before, .el-table__fixed::before 设置…...

Python人工智能:一、语音合成和语音识别

在Python中&#xff0c;语音合成&#xff08;Text-To-Speech, TTS&#xff09;和语音识别&#xff08;Speech-To-Text, STT&#xff09;是两个非常重要的功能&#xff0c;它们在人工智能、自动化、辅助技术以及许多其他领域都有广泛的应用。下面将分别介绍这两个领域在Python中…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...