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

深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!

🔸 第一部分:httpx请求入口

我们从最常用的入口开始,看看如何使用httpx库发送HTTP请求。通常,我们会使用 httpx.get()httpx.post() 方法:

import httpxresponse = httpx.get('https://example.com')
print(response.status_code)
print(response.text)

🔹 这些方法的背后到底发生了什么呢?我们从httpx.get()方法的实现看起。


🔸 第二部分:get方法的实现

httpx.get() 只是对 httpx.request() 方法的简单封装:

# httpx/_api.py
def get(url: str, *, params: dict = None, headers: dict = None, cookies: dict = None, auth = None, timeout = None, allow_redirects: bool = True, **kwargs):return request("GET", url, params=params, headers=headers, cookies=cookies, auth=auth, timeout=timeout, allow_redirects=allow_redirects, **kwargs)

🔹 get()方法将请求方法设置为"GET",然后调用内部的 request() 方法。让我们深入 request() 方法。


🔸 第三部分:request方法揭秘

request() 方法是 httpx 库的核心方法,负责处理所有类型的HTTP请求:

# httpx/_api.py
def request(method: str,url: str,*,params: dict = None,data: dict = None,json: dict = None,headers: dict = None,cookies: dict = None,files: dict = None,auth = None,timeout = None,allow_redirects: bool = True,**kwargs
):with Client() as client:return client.request(method, url, params=params, data=data, json=json, headers=headers, cookies=cookies, files=files, auth=auth, timeout=timeout, allow_redirects=allow_redirects, **kwargs)

🔹 request() 方法创建一个 Client 对象,并调用 client.request() 来实际发送请求。接下来,我们看看 Client 对象的实现。


🔸 第四部分:Client对象的奥秘

Client 对象在httpx库中扮演了重要角色。它不仅可以发送请求,还能管理会话和连接:

# httpx/_client.py
class Client(BaseClient):def request(self,method: str,url: str,*,params: dict = None,data: dict = None,json: dict = None,headers: dict = None,cookies: dict = None,files: dict = None,auth = None,timeout = None,allow_redirects: bool = True,**kwargs):request = self.build_request(method, url, params=params, data=data, json=json, headers=headers, cookies=cookies, files=files, auth=auth)response = self.send(request, timeout=timeout, allow_redirects=allow_redirects, **kwargs)return response

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


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

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

# httpx/_client.py
class Client(BaseClient):def build_request(self,method: str,url: str,*,params: dict = None,data: dict = None,json: dict = None,headers: dict = None,cookies: dict = None,files: dict = None,auth = None) -> Request:request = Request(method=method,url=url,params=params,data=data,json=json,headers=headers,cookies=cookies,files=files,auth=auth,)return request

🔹 build_request() 方法中,将请求的方法、URL、头信息、数据等封装到 Request 对象中。


🔸 第六部分:发送请求

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

# httpx/_client.py
class Client(BaseClient):def send(self,request: Request,*,stream: bool = False,timeout = None,allow_redirects: bool = True,**kwargs) -> Response:response = self._send_handling_redirects(request, timeout=timeout, allow_redirects=allow_redirects, **kwargs)return response

🔹 send() 方法会处理重定向和超时等情况,通过调用 _send_handling_redirects() 方法来实际发送请求。


🔸 第七部分:处理重定向

_send_handling_redirects() 方法负责处理请求的重定向逻辑:

# httpx/_client.py
class Client(BaseClient):def _send_handling_redirects(self,request: Request,*,timeout = None,allow_redirects: bool = True,**kwargs) -> Response:response = self._send_single_request(request, timeout=timeout, **kwargs)while response.is_redirect and allow_redirects:request = self.build_request("GET", response.headers["location"])response = self._send_single_request(request, timeout=timeout, **kwargs)return response

🔹 通过检查响应的重定向状态并构建新的请求对象,_send_handling_redirects() 方法确保了所有重定向都能被正确处理。


🔸 第八部分:发送单个请求

_send_single_request() 方法通过底层的transport来实际发送请求:

# httpx/_client.py
class Client(BaseClient):def _send_single_request(self, request: Request, timeout = None, **kwargs) -> Response:transport = self._transport_for_url(request.url)response = transport.handle_request(request, timeout=timeout)return response

🔹 _send_single_request() 方法中最重要的一步是调用 transport.handle_request() 方法来实际发送请求。


🔸 总结

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

相关文章:

深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!

🔸 第一部分:httpx请求入口 我们从最常用的入口开始,看看如何使用httpx库发送HTTP请求。通常,我们会使用 httpx.get() 或 httpx.post() 方法: import httpxresponse httpx.get(https://example.com) print(response…...

python爬虫【3】—— 爬虫反反爬

一、常见的反爬手段和解决方法 二、splash 介绍与安装 三、验证码识别 图片验证码的处理方案 手动输入(input) 这种方法仅限于登录一次就可持续使用的情况图像识别引擎解析 使用光学识别引擎处理图片中的数据,目前常用于图片数据提取,较少用于验证码…...

LIS接入开发

"LIS" 实验室信息系统(Laboratory Information System)。这是一种用于管理和处理实验室产生的数据和信息的软件系统。LIS广泛应用于各种类型的实验室中,包括医院实验室、独立的参考实验室、病理学实验室以及研究实验室等。 LIS的功…...

Stable Diffusion Windows本地部署超详细教程(手动+自动+整合包三种方式)

2022年作为AIGC(Artificial Intelligence Generated Content)时代的元年,各个领域的AIGC技术都有一个迅猛的发展,给工业界、学术界、投资界甚至竞赛界都注入了新的“AI活力”与“AI势能”。 其中在AI绘画领域,Stable D…...

【Golang 面试 - 基础题】每日 5 题(七)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...

教你如何从Flink小白成为Contributor最终拿到腾讯的Offer

简言:一开始我也是怀揣着成为一个技术大老的梦想开始的,尽管我现在已经入职腾讯三年多了有时候觉得自己还是一个菜鸡哈..... 写这个文章希望可以帮助到刚刚接触大数据,并且对技术怀揣着梦想的朋友们,大家互相学习哈(对Flink不是很…...

java-数据结构与算法-02-数据结构-07-优先队列

1. 概念 队列是一种先进先出的结构,但是有些时候,要操作的数据带有优先级,一般出队时,优先级较高的元素先出队,这种数据结构就叫做优先级队列。 比如:你在打音游的时候,你的朋友给你打了个电话…...

从0开始搭建vue + flask 旅游景点数据分析系统(一):创建前端项目

基于scrapy爬取到的景点和评论数据,本期开始搭建一个vueflask的前后端分离的数据分析系统。 本教程为麦麦原创,也可以去B站找我 👉🏻 我的空间 🧑‍🎓 前置课程 🕸 scrapy实战 爬取景点信息和…...

支持AI的好用的编辑器aieditor

一、工具概述 AiEditor 是一个面向 AI 的下一代富文本编辑器,她基于 Web Component,因此支持 Layui、Vue、React、Angular 等几乎任何前端框架。她适配了 PC Web 端和手机端,并提供了 亮色 和 暗色 两个主题。除此之外,她还提供了…...

数据结构之《栈》

在之前我们已经学习了数据结构中线性表里面的顺序表与链表,了解了如何实现顺序表与链表增、删、查、该等功能。其实在线性表中除了顺序表和链表还有其他的类别,在本篇中我们就将学习另外一种线性表——栈,在通过本篇的学习后,你将…...

Vue3基础语法

一:创建Vue3工程(适用Vite打包工具) Vite官网:Home | Vite中文网 (vitejs.cn) 直接新建一个文件夹,打开cmd运行: npm create vitelatest 选择Vue和TS语言即可 生成一个项目。 Vue3的核心语法&#xff…...

【Python】基础学习技能提升代码样例4:常见配置文件和数据文件读写ini、yaml、csv、excel、xml、json

一、 配置文件 1.1 ini 官方-configparser config.ini文件如下: [url] ; section名称baidu https://www.zalou.cnport 80[email]sender ‘xxxqq.com’import configparser # 读取 file config.ini # 创建配置文件对象 con configparser.ConfigParser() # 读…...

JavaScript基础——JavaScript调用的三种方式

JavaScript简介 JavaScript的作用 JavaScript的使用方式 内嵌JS 引入外部js文件 编写函数 JavaScript简介 JavaScript(简称“JS”)是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。它是Web开发中最常用的脚本语言之一&#x…...

ITSS:IT服务工程师

证书亮点:适中的费用、较低的难度、广泛的应用范围以及专业的运维认证。 总体评价:性价比良好! 证书名称:ITSS服务工程师 证书有效期:持续3年 培训要求:必须参加培训,否则将无法参与考试 发…...

鸿蒙开发——axios封装请求、拦截器

描述:接口用的是PHP,框架TP5 源码地址 链接:https://pan.quark.cn/s/a610610ca406 提取码:rbYX 请求登录 HttpUtil HttpApi 使用方法...

Scikit-Learn中的分层特征工程:构建更精准的数据洞察

Scikit-Learn中的分层特征工程:构建更精准的数据洞察 在机器学习中,特征工程是提升模型性能的核心技术之一。Scikit-Learn(简称sklearn),作为Python中广受欢迎的机器学习库,提供了多种方法来进行特征工程&…...

CSOL遭遇DDOS攻击如何解决

CSOL遭遇DDOS攻击如何解决?在错综复杂的数字网络丛林中,《Counter-Strike Online》(简称CSOL)犹如一座坚固的堡垒,屹立在游戏世界的中心,吸引着无数玩家的目光与热情。这座堡垒并非无懈可击,DDo…...

基于python的BP神经网络红酒品质分类预测模型

1 导入必要的库 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from tensorflow.keras.models import Sequential from tenso…...

Kylin与Spark:大数据技术集成的深度解析

引言 在大数据时代,企业面临着海量数据的处理和分析需求。Kylin 和 Spark 作为两个重要的大数据技术,各自在数据处理领域有着独特的优势。Kylin 是一个开源的分布式分析引擎,专为大规模数据集的 OLAP(在线分析处理)查…...

⌈ 传知代码 ⌋ 利用scrapy框架练习爬虫

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...