很多時候我們不只會發送一次請求,而是多次請求
。若需要在當中儲存一些跨請求的狀態資訊時,例如:cookies,可以考慮使用Session Object
,同時因為底層urllib3使用了connection pool的關係,不需每次都進行TCP三向交握(3-way-handshake)與TLS交握(TLS-hndshake),進而提升整體效能。
session-level的資料可以跨請求,使用method-level的資料可以複寫該次請求客製化的參數。
Any dictionaries that you pass to a request method will be merged with the
session-level
values that are set. Themethod-level
parameters override session parameters.
此外,為了確保每次的Session都有被關掉,可以使用context managers
的寫法
with requests.Session() as s:
s.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
所謂的關掉指得是把更底層所用的Adapter關閉,例如: HTTPAdapter
close()
Closes all adapters and as such the session
送出請求後,拿到的Reponse物件內會帶有和該次請求有關的request屬性,內容其實就是Prepared Requests。
有時候若有一些特別的需求,要針對Body或Header進行處理,可以依照是否要用Session的特性生成Prepared Requests
Request.prepare()
req = Request('POST', url, data=data, headers=headers)
prepped = req.prepare()
Session.prepare_request()
s = Session()
req = Request('GET', url, data=data, headers=headers)
prepped = s.prepare_request(req)