Requests 會話對象

2022-06-27 14:44 更新

會話對象讓你能夠跨請求保持某些參數(shù)。它也會在同一個(gè) Session 實(shí)例發(fā)出的所有請求之間保持 ?cookie?, 期間使用 urllib3 的 ?connection pooling? 功能。所以如果你向同一主機(jī)發(fā)送多個(gè)請求,底層的 TCP 連接將會被重用,從而帶來顯著的性能提升。

會話對象具有主要的 Requests API 的所有方法。

我們來跨請求保持一些 ?cookie?:

s = requests.Session()

s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")

print(r.text)
# '{"cookies": {"sessioncookie": "123456789"}}'

會話也可用來為請求方法提供缺省數(shù)據(jù)。這是通過為會話對象的屬性提供數(shù)據(jù)來實(shí)現(xiàn)的:

s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})

# both 'x-test' and 'x-test2' are sent
s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})

任何你傳遞給請求方法的字典都會與已設(shè)置會話層數(shù)據(jù)合并。方法層的參數(shù)覆蓋會話的參數(shù)。

不過需要注意,就算使用了會話,方法級別的參數(shù)也不會被跨請求保持。下面的例子只會和第一個(gè)請求發(fā)送 ?cookie? ,而非第二個(gè):

s = requests.Session()

r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
# '{"cookies": {"from-my": "browser"}}'

r = s.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {}}'

如果你要手動為會話添加 ?cookie?,就使用 ?Cookie utility? 函數(shù) 來操縱 ?Session.cookies?。

會話還可以用作前后文管理器:

with requests.Session() as s:
    s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')

這樣就能確保 ?with? 區(qū)塊退出后會話能被關(guān)閉,即使發(fā)生了異常也一樣。

從字典參數(shù)中移除一個(gè)值

有時(shí)你會想省略字典參數(shù)中一些會話層的鍵。要做到這一點(diǎn),你只需簡單地在方法層參數(shù)中將那個(gè)鍵的值設(shè)置為 ?None? ,那個(gè)鍵就會被自動省略掉。

包含在一個(gè)會話中的所有數(shù)據(jù)你都可以直接使用。學(xué)習(xí)更多細(xì)節(jié)請閱讀 會話 API 文檔。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號