Python - добавить cookie в cookiejar
Как создать файл cookie и добавить его в экземпляр CookieJar в python?
У меня есть вся информация для файла cookie (имя, значение, домен, путь и т.д.), И я не хочу извлекать новый файл cookie с запросом http.
Я пробовал это, но похоже, что класс 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
Глядя на 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.
Ответ 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
, где это применимо).