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, где это применимо).