【问题标题】:Requests - inability to handle two cookies with same name, different domain请求 - 无法处理两个具有相同名称、不同域的 cookie
【发布时间】:2015-02-19 14:43:01
【问题描述】:

我正在编写一个 Python 2.7 脚本,使用请求来自动访问一个网站,该网站设置了两个具有相同名称但域不同的 cookie,例如命名为“mycookie”,域为“www.example.com”和“subdomain.example.com”。我的客户端脚本需要读取其中 一个 cookie 的值,并将其作为参数包含在后续请求中。因为requests.Session 中的 cookie 访问似乎仅由 cookie 名称键入,所以我看不到提取正确 cookie 值的方法。实际上,尝试使用该名称访问 cookie 会产生以下错误:

  value = session.cookies["mycookie"]
File "/usr/lib/python2.7/site-packages/requests/cookies.py", line 276, in __getitem__
  return self._find_no_duplicates(name)
File "/usr/lib/python2.7/site-packages/requests/cookies.py", line 326, in _find_no_duplicates
  raise CookieConflictError('There are multiple cookies with name, %r' % (name))
requests.cookies.CookieConflictError: There are multiple cookies with name, 'mycookie'

这表明 Requests 的编写假设 cookie 名称在每个会话中都是唯一的。然而,正如所证明的那样,这不一定是正确的。

我想我可以通过维护两个会话并在它们之间手动复制其他重要的 cookie 来解决这个问题。但是,我想知道这是否是 Requests 的已知限制,如果是,推荐的解决方法可能是什么?

【问题讨论】:

  • .example.com 的 cookie 对 www.example.com 也有效;所以你想要哪个饼干?您访问的是哪个网址?
  • 对不起,我弄错了,这两个域实际上是www.example.comsubdomain.example.com。我会更新我的问题。两个 cookie 具有相同的名称,并由两个单独的 GET 请求设置,但第三个请求 POST 需要包含来自两者的 cookie 值。我认为问题可能是我正在尝试对两个域的请求使用单个 Requests.Session 对象。不幸的是,服务器在访问第二个时需要来自第一个的一些 cookie 数据,作为一种身份验证形式。网址不公开。
  • 我已经使用两个requests.Session 对象管理了这个问题的解决方法,并将cookie 从第一个作为cookies=first_session.cookies 参数传递给第二个second_session.get() 调用。这允许为随后的第三个请求验证第二个会话。但是,我被设置 Referer 标头的问题绊倒了,我已经在另一个问题中介绍了这个问题。我认为对于我正在尝试做的事情来说,请求可能太高级了。

标签: python cookies python-requests


【解决方案1】:

Session.cookies 不是字典,而是RequestsCookieJar。尝试使用方法RequestsCookieJar.get(),其定义如下:

def get(self, name, default=None, domain=None, path=None):
    """Dict-like get() that also supports optional domain and path args in
    order to resolve naming collisions from using one cookie jar over
    multiple domains. Caution: operation is O(n), not O(1)."""
    try:
        return self._find_no_duplicates(name, domain, path)
    except KeyError:
        return default

对于您的代码,这意味着更改为:

value = session.cookies.get("mycookie", domain=relevant_domain)

对于请求,我们知道 cookie 名称不是唯一的。 =)

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多