2016-04-14 56 views
0

我關於Python 3.5.1,使用要求,該代碼的相關部分如下:要求CookieJar空甚至認爲該頁面有它

req = requests.post(self.URL, data={"username": username, "password": password}) 
self.cookies = {"MOODLEID1_": req.cookies["MOODLEID1_"], "MoodleSession": req.cookies["MoodleSession"]} 

self.URL具有正確的頁面,並使用POST正在按預期工作,我做了一些印刷檢查,並通過了。

我的輸出:

Traceback (most recent call last): 
    File "D:/.../main.py", line 14, in <module> 
    m.login('juan.siqueira', '211621QWe!') 
    File "D:\...\moodle2.py", line 14, in login 
    self.cookies = {"MOODLEID1_": req.cookies["MOODLEID1_"], "MoodleSession": req.cookies["MoodleSession"]} 
    File "D:\...\venv\lib\site-packages\requests\cookies.py", line 287, in __getitem__ 
    return self._find_no_duplicates(name) 
    File "D:\...\venv\lib\site-packages\requests\cookies.py", line 345, in _find_no_duplicates 
    raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) 
KeyError: "name='MOODLEID1_', domain=None, path=None" 

我試圖運行時調試檢查什麼req.cookies了。但是我得到的結果令人驚訝,至少對我而言。如果你在self.cookies = {...}上放置斷點並運行[(c.name, c.value, c.domain) for c in req.cookies],我會得到一個空白列表,就像那裏沒有任何cookie。

該網站確實發送cookies,通過Chrome擴展程序進行檢查,發現2,「MOODLEID1_」和「MoodleSession」,爲什麼我沒有收到它們?

+0

'req.headers'顯示是由服務器發送的?有沒有任何Set-Cookie標題?如果沒有,那麼服務器沒有發送任何cookie。 –

+0

我沒有在'req.headers'上找到任何'Set-Cookie',但在Chrome上我可以使用擴展名清楚地看到這兩個cookie。爲什麼我無法在腳本中看到它們? – JChris

+0

Cookie總是通過「Set-Cookie」標頭從服務器發送到客戶端。 Chrome中的Cookie並不意味着它們是由您現在發佈的網址設置的;它們可能是由一個*不同的*網址設置的。您需要找到服務器發佈「Set-Cookie」標頭的URL。 –

回答

0

該響應似乎沒有包含任何cookie。在req.headers中查找一個或多個Set-Cookie標題。

存儲在瀏覽器中的Cookie存在,因爲響應包含每個這些cookie的Set-Cookie標頭。你必須找到服務器設置這些cookie的響應;顯然這不是這個的迴應。

如果您需要跨請求保留這些cookie(一旦設置),請使用requests.Session() object;這將保留任何由回覆返回的cookies並根據新的請求再次發送出去。

+0

謝謝。 'requests.Session()'像一個魅力一樣工作。的確,這些cookie來自另一個URL。 – JChris

+0

這個答案並不能解決問題。 –

+0

@ 0n10n_:答案解決了OP的問題。我不知道它是否能解決你的特定情況,因爲你沒有告訴我這件事。 –

相關問題