繁体   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