http協議本身是無狀態的,為了讓請求之間保持狀態,有了session和cookie機制。requests也提供了相應的方法去操縱它們。
requests中的session對象能夠讓我們跨http請求保持某些參數,即讓同一個session對象發送的請求頭攜帶某個指定的參數。當然,最常見的應用是它可以讓cookie保持在后續的一串請求中。
下面,通過官方文檔中的示例來了解如何使用它。
import requests s = requests.Session() # 第一步:發送一個請求,用於設置請求中的cookies # tips: http://httpbin.org能夠用於測試http請求和響應 s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') # 第二步:再發送一個請求,用於查看當前請求中的cookies r = s.get("http://httpbin.org/cookies") print(r.text)
運行結果
{ "cookies": { "sessioncookie": "123456789" } }
從結果中我們可以看出,第二次請求已經攜帶上了第一次請求所設置的cookie,即通過session達到了保持cookie的目的。示例中創建了一個requests.Session()對象,通過該對象來進行http請求操作,該操作基本類似於requests.request(),可查看python之requests模塊-request api進行了解。
由於session讓請求之間具有了連貫性,那么,就有了跨請求參數和非跨請求參數的區別。即有時我想讓所有請求均帶有某個參數,而有時我只是想讓單獨的一條請求帶上臨時的參數。通過下面的例子來了解如何使用。
import requests s = requests.Session() s.headers.update({'x-test': 'true'}) # both 'x-test' and 'x-test2' are sent r1 = s.get('http://httpbin.org/headers', headers={'x-test2': 'true'}) print(r1.text) # 'x-test' is sent r2 = s.get('http://httpbin.org/headers') print(r2.text)
運行結果
# r1.text { "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.22.0", "X-Amzn-Trace-Id": "Root=1-5e91656f-b99f14a4d6f47f9e55a90bb4", "X-Test": "true", "X-Test2": "true" } } # r2.text { "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.22.0", "X-Amzn-Trace-Id": "Root=1-5e91656f-e9741db4c2ca2fd6e0628396", "X-Test": "true" } }
從結果中我們可以得出兩條結論:
- session可以為請求方法提供缺省數據,比如第一次請求中的{'x-test': 'true'}就是缺省數據,此時的缺省數據就是跨請求參數。
- 方法級別的參數不會被跨請求保持,比如第二次請求時,沒有攜帶headers={'x-test2': 'true'},返回的結果中也沒有{'x-test2': 'true'},說明該參數沒有在第一次請求后被保持住。
參考資料
- https://github.com/psf/requests/blob/master/requests/sessions.py
- https://requests.readthedocs.io/en/master/user/advanced/#session-objects