【问题标题】:python's requests do not handle cookies correctly?python的请求不能正确处理cookies?
【发布时间】:2015-07-04 08:30:31
【问题描述】:

我遇到了简单授权和上传 API 脚本的问题。

授权后,客户端会收到多个 cookie,包括 PHPSESSID cookie(在浏览器中)。

我使用requests.post 方法和表单数据进行授权:

r = requests.post(url, headers = self.headers, data = formData)
self.cookies = requests.utils.dict_from_cookieja(r.cookies)

标题仅用于自定义 User-Agent

授权是 100% 好的(页面上有一个注销链接)。 后来,我尝试使用授权的会话 cookie 上传数据:

r = requests.post(url, files = files, data = formData, headers = self.headers, cookies = self.cookies)

但网站拒绝了该请求。如果我们比较来自脚本和谷歌浏览器(使用 Wireshark)的请求,请求正文没有差异。

唯一的区别是请求类发送 2 cookie,而谷歌浏览器发送 7

更新:仔细检查,第一个请求收到 7 个 cookie。 post 方法只是忽略一半...

【问题讨论】:

  • 我不知道requests 有任何cookie 问题,没有。使用 Chrome 隐身标签时,对网站的第一个请求设置了多少个 cookie?该站点可以很好地根据用户代理或其他请求标头改变行为。接下来,您确定该页面没有使用登录表单中嵌入的 CSRF 令牌吗?
  • 接下来,cookie 的有效期是什么时候?这些 cookie 上是否设置了特定标志?当您使用 requests.Session() 对象来管理 cookie 时会发生什么?
  • @MartijnPieters 我的错,我已经解决了错误。我没有使用session 类的经验,对未来的好建议!

标签: python python-3.x cookies python-requests multipartform-data


【解决方案1】:

我在代码中的错误是我将每个下一个 API 请求中的 cookie分配到会话 cookie 字典中。在登录后的每个请求中,cookie 都会被即将到来的响应 cookie “重置”,这就是问题所在。由于 auth cookie 仅在登录请求时分配,它们在下一次请求时丢失。

在每个授权请求之后,我使用 update(),而不是分配。

self.cookies.update( requests.utils.dict_from_cookiejar(r.cookies) )

解决了我的问题,上传工作正常!

【讨论】:

  • 您应该只是使用会话,因此您不必自己处理它们
猜你喜欢
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多