讲师中心 微信公众号
AI工具推荐 视频效率加速

Python HTTP 客户端 requests 的实现原理

小杰同学_4622

小杰同学_4622

发布时间:2026-01-30 20:55:51

|

985人浏览过

|

来源于php中文网

原创

requests 底层基于 urllib3 而非 urllib,由 urllib3 管理连接池、重试、SSL 验证和 HTTP/1.1 流水线;它不支持 HTTP/2 和异步,重试需手动配置 HTTPAdapter。

python http 客户端 requests 的实现原理

requests 底层用的是 urllib3,不是 urllib

requests 本身不直接操作 socket,它把网络请求的细节全交给了 urllib3。这个库负责连接池、重试、SSL 验证、HTTP/1.1 流水线等核心逻辑。你调用 requests.get() 时,实际是 urllib3.PoolManager 在背后管理连接、复用 TCP 连接、自动处理 Connection: keep-alive。

常见误解是 requests 封装了标准库的 urllib.request,其实完全无关——requests 早期确实基于它,但 2013 年起就彻底切换到 urllib3(一个独立维护的第三方库),因为后者支持连接池、更可控的超时、更好的错误分类。

  • requests.Session() 对应一个 urllib3.PoolManager 实例,所以复用 Session 才能真正复用连接池
  • 如果你禁用连接池(比如传 pool_connections=0),urllib3 会退化为每次新建连接,性能骤降
  • requests.adapters.HTTPAdapter 是你和 urllib3 之间的胶水层,所有自定义行为(如重试策略、池大小)都通过它配置

HTTP/2 和异步不是 requests 的事

requests 是同步阻塞式 HTTP 客户端,不支持 HTTP/2,也不支持 async/await。它发请求时会卡住当前线程,直到响应头收完(或超时)。这意味着:

  • 即使服务端支持 HTTP/2,requests 也只走 HTTP/1.1 —— 它压根没实现 HTTP/2 帧解析
  • 想并发发 100 个请求?靠 threading 或 multiprocessing 硬扛,不是靠 requests 本身“变快”
  • 真正的异步替代方案是 aiohttp 或 httpx(后者 sync/async 双模式,底层用 httpcore 而非 urllib3)

SSL 验证和证书路径由 urllib3 控制,但 requests 提供快捷入口

证书验证逻辑在 urllib3.util.ssl_.create_urllib3_context() 里,它默认加载系统 CA 包(如 certifi),但你可以绕过或替换:

Session Archiver Pro
Session Archiver Pro

从AI对话中提取决策、待办、知识点、偏好和风险,生成结构化记忆,支持Markdown、JSON或Obsidian笔记格式。

下载

立即学习“Python免费学习笔记(深入)”;

  • 设 verify=False 会跳过全部 SSL 校验,同时 suppress InsecureRequestWarning
  • 传路径如 verify="/path/to/cert.pem",urllib3 会用它作为 CA bundle,而非系统默认
  • 环境变量 REQUESTS_CA_BUNDLE 或 CERT_PATH 会影响 urllib3 加载位置,但优先级低于代码中显式传入的 verify=
  • 自签名证书场景下,别只改 verify=False;更安全的做法是导出证书、用 verify="mycert.crt"

重试机制必须手动打开,且只对部分状态码生效

requests 默认不重试任何请求。要启用重试,得配 HTTPAdapter 并挂到 Session 上:

from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

retry_strategy = Retry(
    total=3,
    status_forcelist=[429, 500, 502, 503, 504],
    allowed_methods=["HEAD", "GET", "OPTIONS"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session = requests.Session()
session.mount("https://", adapter)

注意几个关键点:

  • total 是总尝试次数(含首次),不是“额外重试几次”
  • status_forcelist 必须显式列出要重试的状态码;400、401、403、404 默认不重试
  • allowed_methods 默认不含 POST,因为非幂等方法重试有风险;若真要重试 POST,得明确加上
  • 重试间隔默认是指数退避,但不会 sleep 主线程——urllib3 在每次重试前会调用 time.sleep(),这点容易被忽略

底层超时(connect / read)和重试是两套独立机制,别以为设了 timeout=(3, 30) 就自动带重试。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

876

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1926

2025.08.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4438

2023.08.10

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3703

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

934

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

6646

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

5490

2024.08.16

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn