【问题标题】:python - add cookie to cookiejarpython - 将cookie添加到cookiejar
【发布时间】:2011-06-08 19:00:27
【问题描述】:

如何创建 cookie 并将其添加到 python 中的 CookieJar 实例? 我拥有 cookie 的所有信息(名称、值、域、路径等),我不想通过 http 请求提取新 cookie。

我试过了,但看起来 SimpleCookie 类与 CookieJar 不兼容(是否还有另一个 Cookie 类?)

import Cookie
c = Cookie.SimpleCookie()
c["name"]="value"
c['name']['expires'] = 0
c['name']['path'] = "/"
c['name']['domain'] = "mydomain.com"
cj = cookielib.CookieJar()
cj.set_cookie(cookie)

Traceback (most recent call last):
    cj.set_cookie(cookie)
  File "/usr/lib/python2.6/cookielib.py", line 1627, in set_cookie
    if cookie.domain not in c: c[cookie.domain] = {}
AttributeError: 'SimpleCookie' object has no attribute 'domain'

【问题讨论】:

  • 你使用这个的上下文是什么?这些东西已经在 python web 服务和请求框架中重新实现了很多。

标签: python cookies


【解决方案1】:

查看 cookielib,你会得到:

try:
    from cookielib import Cookie, CookieJar         # Python 2
except ImportError:
    from http.cookiejar import Cookie, CookieJar    # Python 3
cj = CookieJar()
# Cookie(version, name, value, port, port_specified, domain, 
# domain_specified, domain_initial_dot, path, path_specified, 
# secure, discard, comment, comment_url, rest)
c = Cookie(None, 'asdf', None, '80', '80', 'www.foo.bar', 
       None, None, '/', None, False, False, 'TestCookie', None, None, None)
cj.set_cookie(c)
print cj

给予:

<cookielib.CookieJar[<Cookie asdf for www.foo.bar:80/>]>

实例化参数没有真正的健全性检查。端口必须是字符串,而不是 int。

【讨论】:

  • 虽然为真,但这并不涉及Cookie 模块是否可以与cookielib 模块兼容。
  • 在这种情况下,您可能只需要创建一个自己的 Cookie 类型,它提供两个接口。 Cookiejar 对它作为 cookie 得到的东西并不十分挑剔。新的 cookie 只需要 domainpathname 属性,并且不能有 items。基本上就是这样。 cookielib internals 确实是一些轻量级的讲座,易于消化,非常推荐阅读。
  • 我刚刚注意到 - Cookie() 接受 15 个参数,而您在调用它时提供了 16 个。这是笔误吗?
  • 我猜第 16 位是这个可选的 rfc2109 参数。
【解决方案2】:

这里的关键点是方法cj.set_cookie 需要一个类cookielib.Cookie 的对象作为它的参数(所以是的,还有另一个Cookie 类),不是 Cookie.SimpleCookie 类的对象(或模块 Cookie 中的任何其他类)。尽管名称的相似性令人困惑,但这些类(如观察到的)根本不兼容。

请注意,cookielib.Cookie 的构造函数的参数列表在过去的某个时间点可能已更改(并且将来可能会再次更改,因为似乎不希望在 cookielib 之外使用此类) ,至少help(cookielib.Cookie)目前给了我

# Cookie(version, name, value, port, port_specified, domain,
# domain_specified, domain_initial_dot, path, path_specified,
# secure, expires, discard, comment, comment_url, rest, rfc2109=False)

注意附加的expires 参数和rfc2109 使用但未记录在上面@Michael 答案中的代码中,因此示例应该类似于

c = Cookie(None, 'asdf', None, '80', True, 'www.foo.bar', 
   True, False, '/', True, False, '1370002304', False, 'TestCookie', None, None, False)

(在适用的情况下还替换了None 的一些布尔常量)。

【讨论】:

  • 如果这两个不兼容,哪些模块分别使用它们中的任何一个?例如。 Cookie 是否与任何标准库模块兼容? cookielib 呢?为什么要一个人使用一个而不是另一个?
猜你喜欢
  • 1970-01-01
  • 2011-08-23
  • 2018-03-24
  • 2011-01-11
  • 2013-06-17
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多