python - добавить cookie в cookiejar - PullRequest
11 голосов
/ 14 января 2011

Как мне создать 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'

Ответы [ 2 ]

11 голосов
/ 02 октября 2012

Глядя на 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 голосов
/ 31 мая 2013

Важным моментом здесь является то, что метод 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, где это применимо).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...