requests 库升级通常不会直接改变会话保持的核心逻辑,但底层依赖 urllib3 的版本变化可能影响连接复用。适配重点在于锁定依赖版本并检查 Session 对象的生命周期管理,避免在循环中重复创建 Session 实例。
先说结论:大多数情况下无需修改业务代码,但需排查底层依赖兼容性并规范 Session 复用方式。
- 先确认:检查升级前后 urllib3 和 charset_normalizer 的版本差异,确认是否存在已知兼容性公告。
- 先处理:在 requirements.txt 中 pinned 关键依赖版本,代码中确保全局复用同一个 Session 对象。
- 再验证:通过抓包或日志确认 TCP 连接是否复用,以及 Cookie 是否在多次请求间正确携带。
命令速用版
使用以下命令检查当前环境依赖版本,并锁定关键库以防止自动升级导致的行为差异。
# 查看当前 requests 及底层依赖版本
pip show requests urllib3 charset_normalizer
# 锁定版本示例(根据实际测试稳定的版本填写)
pip install requests==2.31.0 urllib3==1.26.15 charset_normalizer==3.2.0
# 生成依赖锁定文件
pip freeze > requirements.txt为什么会这样
会话保持依赖 Session 对象维护 CookieJar 和 HTTP 连接池,升级导致的问题通常源于底层网络库变更而非 requests 本身。
requests 库的 Session 机制核心在于复用 TCP 连接和自动管理 Cookie。升级后若出现会话丢失或连接错误,往往是因为底层 urllib3 库更新了 TLS 策略或连接池逻辑。例如 urllib3 2.0 版本移除了对旧版 OpenSSL 的支持,可能导致握手失败从而中断会话。此外,若代码在每次请求时实例化新的 Session,升级后的垃圾回收机制或资源限制可能加剧连接断开。
分步处理
按照以下步骤排查代码逻辑和依赖环境,确保会话机制稳定。
步骤 1:审计 Session 实例化位置
检查代码中是否在全局作用域或类单例中维护 Session,避免在循环内部创建。
# 错误示范:每次请求都新建 Session
for url in url_list:
requests.get(url)
# 正确示范:复用 Session 对象
session = requests.Session()
for url in url_list:
session.get(url)步骤 2:锁定依赖版本
在升级 requests 前,先查阅 GitHub Release 页面确认底层依赖变化。若生产环境稳定,建议在 requirements.txt 中明确指定 urllib3 版本。
步骤 3:配置适配器参数
若升级后出现连接池报错,可显式配置 HTTPAdapter 调整池大小和重试策略。
from requests.adapters import HTTPAdapter
session.mount('http://', HTTPAdapter(pool_connections=10, pool_maxsize=10, max_retries=3))
session.mount('https://', HTTPAdapter(pool_connections=10, pool_maxsize=10, max_retries=3))怎么验证是否生效
通过日志分析和网络抓包确认连接复用和 Cookie 携带情况。
检查连接复用:开启 urllib3 调试日志,观察是否出现“Starting new HTTP connection”频繁打印。若会话保持生效,后续请求应复用现有连接。
import logging
logging.getLogger("urllib3").setLevel(logging.DEBUG)检查 Cookie 保持:在服务器端日志或响应头中确认 Set-Cookie 是否仅在首次请求出现,后续请求是否携带 Cookie 头。也可在代码中打印 session.cookies 内容对比。
常见坑
以下场景容易导致升级后会话行为异常,需谨慎处理。
- 多线程共享 Session:requests 的 Session 对象不是线程安全的。多线程环境下升级后若出现随机失败,应为每个线程创建独立 Session 实例。
- 重定向策略变更:部分版本调整了默认重定向次数或处理逻辑,需检查 allow_redirects 参数是否符合预期。
- SSL 上下文重置:升级 urllib3 后,自定义的 SSL 验证逻辑可能需要重新绑定到 adapter 中,否则会导致握手失败。
常见问题
升级后 Cookie 无法保持怎么办?
检查是否复用了同一个 Session 对象,且确认服务器端未变更 Cookie 策略。
出现 urllib3 版本冲突报错如何处理?
手动安装兼容的 urllib3 版本,或在 requirements.txt 中排除冲突版本范围。
连接池报错 PoolManager 是什么意思?
表示连接复用配置不当,需检查 HTTPAdapter 的 pool_maxsize 设置是否过小。
参考来源
- requests Documentation, Session Objects, https://docs.python-requests.org/en/latest/user/advanced/#session-objects
- urllib3 Documentation, Connection Pooling, https://urllib3.readthedocs.io/en/latest/reference/urllib3.poolmanager.html
- psf/requests GitHub Repository, Release History, https://github.com/psf/requests/releases