1. 程式人生 > 程式設計 >Python requests模組session程式碼例項

Python requests模組session程式碼例項

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()

由於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": "*/*","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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。