Python - 将cookie添加到cookiejar

14
我如何在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'

1
你在什么上下文环境中使用这个?在Python Web服务和请求框架中,这个东西已经被不断重新实现过了。 - Jonathan Vanasco
2个回答

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/>]>

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


1
无论如何,这并不涉及“Cookie”模块是否可以与“cookielib”模块兼容。 - n611x007
1
在这种情况下,您可能只需创建自己的“Cookie”类型,该类型提供两个接口。Cookiejar 对于作为 cookie 提供的内容并不挑剔。新 cookie 只需要具有“domain”、“path”和“name”属性,而不必具有“items”。基本上就是这样。 cookielib 内部确实是一些轻量级的讲座,易于理解,并且非常推荐阅读。 - Michael
我刚刚注意到 - Cookie() 接受 15 个参数,而你在调用它时提供了 16 个。这是笔误吗? - reedog117
我猜16日是rfc2109的可选参数。 - Michael

2
关键在于方法需要一个类的对象作为它的参数(所以是,有另一个Cookie类),而不是Cookie.SimpleCookie类或任何其他在模块中找到的类的对象。尽管名称相似,但这些类(如观察到的)并不兼容。
请注意,构造函数的参数列表在过去可能已经发生了变化(并且将来可能会再次变化,因为此类似乎不应在之外使用),至少当前给我:
# 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)

请注意上面@Michael答案中未记录在代码中但使用的附加expires参数和rfc2109参数,因此示例应该变成类似以下内容:
c = Cookie(None, 'asdf', None, '80', True, 'www.foo.bar', 
   True, False, '/', True, False, '1370002304', False, 'TestCookie', None, None, False)

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

如果这两个不兼容,哪些模块分别使用它们?例如,Cookie与任何标准库模块兼容吗?cookielib呢?为什么要使用其中一个而不是另一个? - n611x007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接