请求 CookieJar 为空,即使页面有它

JCh*_*ris 6 python cookies python-requests

我在Python 3.5.1上,使用请求,相关部分代码如下:

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

self.URL有正确的页面,并且 POST 按预期工作,我做了一些打印来检查,它通过了。

我的输出:

Traceback (most recent call last):
  File "D:/.../main.py", line 14, in <module>
    m.login('first.last', 'pa$$w0rd!')
  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"
Run Code Online (Sandbox Code Playgroud)

我正在尝试在运行时进行调试以检查req.cookies有什么。但我得到的结果是令人惊讶的,至少对我来说。如果你设置一个断点self.cookies = {...}并运行[(c.name, c.value, c.domain) for c in req.cookies],我会得到一个空列表,就像里面没有任何 cookie 一样。

该网站确实发送 cookie,使用 Chrome 扩展进行检查,我发现了 2 个“MOODLEID1_”和“MoodleSession”,那么为什么我没有收到它们呢?

Mar*_*ers 6

该响应似乎不包含任何 cookie。Set-Cookie在 中查找一个或多个标头req.headers

浏览器中存储的 Cookie 之所以存在,是因为响应中包含Set-Cookie每个 Cookie 的标头。您必须找到服务器设置这些 cookie 的响应;显然这不是这个回应。

如果您需要跨请求保留这些 cookie(一旦设置),请使用requests.Session()对象;这将保留响应返回的任何 cookie,并根据新请求再次发送它们。