简单描述执行流程
Q:能简单描述一下发送一个requests.get(url)
请求时,在requests库内部的主要执行流程吗?(从调用get
方法到收到响应)
- 入口委托:
get()
方法内部调用requests.request('GET', url)
。- Session 接管:
request()
方法会获取或隐式创建一个Session
对象,并调用其request()
方法。Session
是核心,负责管理 Cookies、连接池复用和全局配置。- 请求准备:
Session
将传入的参数(URL、headers、params 等)合并、编码,构建成一个标准的PreparedRequest
对象。- 适配器与发送:
Session
根据 URL 协议 (http/https) 选择对应的HTTPAdapter
。HTTPAdapter
利用底层的urllib3
连接池 获取一个到目标服务器的连接(或新建),然后发送PreparedRequest
。- 处理响应:
- 处理重定向: 如果响应是重定向 (3xx) 且允许 (
allow_redirects=True
),会自动处理重定向链,直到获得最终响应。- 构建响应: 将
urllib3
的原始响应封装成requests.Response
对象,设置状态码、头信息、Cookies (更新Session
)、历史记录等。- 返回结果: 最终
Response
对象返回给调用者。- 释放资源: 通过
with requests.Session() as request:
显式使用上下文管理器,确保在退出时自动调用request.close()
,释放底层的urllib3
连接池资源,避免连接泄漏。
Request和Response的职责与关联
Q:requests.models.Request
和 requests.models.Response
这两个核心类分别负责什么?它们之间是如何关联的?
- Request:主