簡單描述執行流程
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:主