python - 向 cookiejar 添加 cookie

14 投票
2 回答
21926 浏览
提问于 2025-04-16 09:55

我该如何在Python中创建一个cookie,并把它添加到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'

2 个回答

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 参数和在 @Michael 的回答中使用但没有文档说明的 rfc2109 参数,所以示例应该变成类似于

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

(同时在适用的地方将一些布尔常量替换为 None)。

11

看一下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/>]>

在创建这个东西的时候,没有什么真正的合理性检查。端口号必须是字符串,而不是整数。

撰写回答