2016-04-14 62 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的问题。我不知道它是否能解决你的特定情况,因为你没有告诉我这件事。 –

相关问题