簡體   English   中英

使用請求模塊,如何處理請求響應中的“set-cookie”?

[英]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的包含類,它會自動為您處理此類事情。 您可以創建它的一個實例,然后在該實例上調用getset 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM