[英]Using requests module, how to handle 'set-cookie' in request response?
我正在嘗試打開登錄頁面 (GET),獲取網絡服務器提供的 cookie,然后提交用戶名和密碼對以登錄站點 (POST)。
看看這個 Stackoverflow question/answer ,我認為我會做以下事情:
import requests
import cookielib
URL1 = 'login prompt page'
URL2 = 'login submission URL'
jar = cookielib.CookieJar()
r = requests.get(URL1, cookies=jar)
r2 = requests.post(URL2, cookies=jar, data="username and password data payload")
但是,在r
中,標頭中有一個set-cookie
,但在jar
對象中並沒有改變。 事實上,正如鏈接問題的回答所表明的那樣,沒有任何內容被填充到jar
中。
我在我的代碼中通過使用 headers dict 來解決這個問題,在執行 GET 或 POST 之后,使用它來處理set-cookie
標頭:
headers['Cookie'] = r.headers['set-cookie']
然后在請求方法中傳遞標頭。 這是正確的,還是有更好的方法來應用set-cookie
?
忽略 cookie-jar,讓requests
為您處理 cookie。 改用會話對象,它會保留 cookie 並將它們發送回服務器:
with requests.Session() as s:
r = s.get(URL1)
r = s.post(URL2, data="username and password data payload")
有一個稱為session
的包含類,它會自動為您處理此類事情。 您可以創建它的一個實例,然后在該實例上調用get
和set
right。
import requests
URL1 = 'login prompt page'
URL2 = 'login submission URL'
session = requests.Session()
r = session.get(URL1)
r2 = session.post(URL2, data="username and password data payload")
另一種對我v2.18.4
方法(不使用會話對象)如下(在v2.18.4
測試)。
jar = requests.cookies.RequestsCookieJar()
response1 = requests.get(some_url, cookies=jar) # or post ...
jar.update(response1.cookies)
response2 = requests.get(some_other_url, cookies=jar) # or post ...
請注意,如果存在由Requests庫透明處理的重定向,上述代碼將失敗。 在這種情況下,您還必須使用重定向響應中發送的 cookie 更新您的 jar。 例如,通過執行以下操作:
if (response.history): # we have to add to the cookie jar, the cookies sent by the server in intermediate responses
for historicResponse in response.history:
jar.update(historicResponse.cookies)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.