使用请求模块,如何处理请求响应中的“set-cookie”?

Posted

技术标签:

【中文标题】使用请求模块,如何处理请求响应中的“set-cookie”?【英文标题】:Using requests module, how to handle 'set-cookie' in request response? 【发布时间】:2014-03-11 07:29:15 【问题描述】:

我正在尝试打开登录页面 (GET),获取网络服务器提供的 cookie,然后提交用户名和密码对以登录网站 (POST)。

看着this *** 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 header:

headers['Cookie'] = r.headers['set-cookie']

然后在请求方法中传递标头。这是正确的,还是有更好的方法来应用set-cookie

【问题讨论】:

【参考方案1】:

忽略cookie-jar,让requests 为您处理cookie。改用session object,它会保留cookie并将它们发送回服务器:

with requests.Session() as s:
    r = s.get(URL1)
    r = s.post(URL2, data="username and password data payload")

【讨论】:

【参考方案2】:

有一个名为session 的包含类,它会自动为您处理这类事情。您可以创建它的一个实例,然后在该实例上直接调用getset

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")

【讨论】:

【参考方案3】:

对我有用的另一种方法(不使用session objects)如下(在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)

【讨论】:

在 Python 3.7.3 中,requests v 2.23.0, response1.cookies 返回空的 CookieJar 对象。可悲的是,看起来我们无法避免现代版本中的 Session() 对象。

以上是关于使用请求模块,如何处理请求响应中的“set-cookie”?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 react/redux 中的请求错误?

okhttp:如何处理来自服务器的未请求/意外 100(继续)响应?

mongodb 连接如何处理 NodeJS express 服务器中的并发请求?

如何处理重定向请求以响应浏览器上的下载文件。

如何处理Zuul中的hystrix后备?

Nginx 如何处理 HTTP 请求?