问题 python - 将cookie添加到cookiejar


如何创建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'

9225
2018-01-13 21:14


起源

你正在使用它的背景是什么?这些东西已经在python web服务和请求框架中重新实现了很多。 - Jonathan Vanasco


答案:


看着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。


11
2017-10-01 23:17



虽然是真的,但这并没有触及是否 Cookie 模块可以与之兼容 cookielib 模块,或者不是。 - n611x007
可能你会创建一个自己的 Cookie 在这种情况下键入,它提供两个接口。 Cookiejar对于它作为一个cookie获得的东西并不是很挑剔。新的cookie只需要 domain, path 和 name 属性,不能有 items。基本上就是这样。 cookielib 内部实际上是一些轻量级的讲座,易于消化和非常推荐的阅读。 - Michael
我刚注意到--Cookie()需要15个参数,并且在调用它时会提供16个参数。这是拼写错误吗? - reedog117
我猜第16个是这个可选的rfc2109参数。 - Michael


这里的关键点是方法 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 适用时)。


2
2018-05-31 12:24



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