深入解析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的核心语法ÿ…...
【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…...
突破3D打印障碍:SketchUp STL插件的技术革新与实践指南
突破3D打印障碍:SketchUp STL插件的技术革新与实践指南 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 当一位产品…...
深入Fly-By拓扑:为什么你的LPDDR4必须做Write Leveling?一次讲清时钟与数据对齐的核心原理
深入Fly-By拓扑:为什么你的LPDDR4必须做Write Leveling?一次讲清时钟与数据对齐的核心原理 在4266 Mbps的高速数据传输场景下,LPDDR4内存子系统如同一条需要精确调谐的八车道高速公路。当信号传输速率突破4GT/s时,皮秒级的时序偏差…...
低成本低功耗认证芯片推荐——LCS4110R
LCS4110R是以32位安全CPU内核为基础的高性价比安全芯片,符合EAL4安全等级设计要求,自带DES/TDES硬件协处理器。LCS4110R芯片是业内拥有自主设计的产品,集成内部文件系统,支持LKCOS系统,自主可控,供货稳定。…...
STM32F407ZGT6最小系统:从原理图到PCB的实战设计解析
1. STM32F407ZGT6最小系统设计入门 第一次接触STM32F407ZGT6最小系统设计时,我也被各种专业术语和复杂的电路图搞得晕头转向。但经过几个项目的实战后,我发现只要掌握几个关键模块,设计一个稳定可靠的最小系统其实并不难。STM32F407ZGT6是STM…...
translategemma-4b-it优化升级:Ollama部署后提升翻译质量的4个技巧
translategemma-4b-it优化升级:Ollama部署后提升翻译质量的4个技巧 你已经成功用Ollama部署了translategemma-4b-it,看着它把图片里的英文变成中文,是不是觉得挺神奇的?但用了几次后,你可能会发现一些问题:…...
动态间隙精准诊断:NHJX-13 型底盘间隙仪机动车底盘安全检测全方案
动态间隙精准诊断:NHJX-13 型底盘间隙仪机动车底盘安全检测全方案在机动车安全环保检测体系中,底盘间隙仪是诊断车辆转向机构、悬挂系统、传动部件间隙状况的核心设备,尤其对大中型客车、重中型货车等营运车辆,其性能直接决定底盘…...
让AI成为开发伙伴:调用快马模型为养龙虾系统添加智能预测与问答功能
最近在开发一个养龙虾的智能决策系统,发现很多功能模块如果纯手写会非常耗时。尝试用AI辅助开发后,效率提升了不少,这里分享下具体实现思路和踩坑经验。 生长预测模块的实现 这个模块需要根据历史水温、投喂量等数据预测龙虾未来一周的生长情…...
GLM-4V-9B在智能客服场景的应用:快速搭建图片问答机器人
GLM-4V-9B在智能客服场景的应用:快速搭建图片问答机器人 1. 引言:智能客服的新需求 在电商和在线服务领域,每天都有大量用户上传产品图片、截图或文档,询问相关问题。传统客服系统只能处理文字咨询,面对图片类问题往…...
Phi-4-mini-reasoning在LSTM时间序列预测中的应用与优化
Phi-4-mini-reasoning在LSTM时间序列预测中的应用与优化 1. 当传统预测遇上智能推理 时间序列预测一直是数据分析领域的经典难题。无论是股票价格波动还是商品销量变化,传统的LSTM模型虽然能捕捉时间依赖关系,但面对突发新闻事件或政策变化时ÿ…...
别再死记硬背了!用FPGA和Verilog HDL手把手带你玩转数字电路设计(附避坑指南)
用FPGA和Verilog HDL玩转数字电路设计:从理论到实战的避坑指南 数字电路设计常常让初学者感到抽象和枯燥——真值表、状态机、时序约束这些概念看似冰冷,但当你亲手用FPGA开发板点亮第一个LED时,一切都会变得生动起来。本文将带你用Xilinx Ar…...
