2011-01-13 10 views
11

Jak utworzyć plik cookie i dodać go do instancji CookieJar w pythonie? Mam wszystkie informacje dotyczące pliku cookie (nazwa, wartość, domena, ścieżka itp.) I nie chcę wyodrębniać nowego pliku cookie z żądaniem http.python - dodaj ciasteczko do cookiejar

próbowałem tego, ale wygląda na to klasa SimpleCookie nie jest kompatybilny z CookieJar (? Czy istnieje inna klasa 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

Jaki jest kontekst, z którego korzystasz? Te rzeczy zostały zreplikowane wiele razy w Pythonie. –

Odpowiedz

11

Patrząc na cookielib dostaniesz:

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 

Daje:

<cookielib.CookieJar[<Cookie asdf for www.foo.bar:80/>]> 

Brak prawdziwych kontroli poprawności dla parametrów instancji. Porty muszą być ciągami, a nie int.

+0

prawda, nie wpływa to na to, czy moduł 'Cookie' może być kompatybilny z modułem' cookielib', czy też nie. – n611x007

+1

Prawdopodobnie utworzysz w tym przypadku własny typ "Cookie", który oferuje oba interfejsy. Cookiejar nie jest zbyt wrażliwy na to, co dostaje jako plik cookie. Nowy plik cookie wymaga jedynie atrybutów "domena", "ścieżka" i "nazwa" i nie może zawierać "elementów". To w zasadzie. Wewnętrzne "cookielib" to naprawdę lekki wykład, lekkostrawna i bardzo polecana lektura. – Michael

+0

Właśnie zauważyłem - Cookie() pobiera 15 parametrów, a Ty podajesz 16, gdy je wywołujesz. Czy to literówka? – reedog117

2

Zasadniczą kwestią jest to, że metoda cj.set_cookie oczekuje obiekt klasy cookielib.Cookie jako parametr (tak tak, nie ma innej klasy Cookie) nie obiekt klasy Cookie.SimpleCookie (lub jakakolwiek inna klasa w module Cookie). Klasy te są po prostu niezgodne, pomimo mylącego podobieństwa nazw.

Należy zauważyć, że lista parametrów konstruktora dla cookielib.Cookie mogła ulec zmianie w pewnym momencie w przeszłości (i może się zmienić w przyszłości, ponieważ ta klasa prawdopodobnie nie będzie używana poza cookielib), co najmniej help(cookielib.Cookie) obecnie daje mi

# 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) 

Uwaga dodatkowa expires parametru i parametr rfc2109 używane, ale nie udokumentowane w kodzie w @ odpowiedź Michaela powyżej, więc przykład powinien stać coś

c = Cookie(None, 'asdf', None, '80', True, 'www.foo.bar', 
    True, False, '/', True, False, '1370002304', False, 'TestCookie', None, None, False) 

(w razie potrzeby zastępuje niektóre stałe logiczne dla None).

+0

jeśli te dwie są niekompatybilne, które moduły używają odpowiednio jednego z nich? na przykład. czy plik 'Cookie' jest zgodny z jakimkolwiek modułem biblioteki standardowej? co powiesz na "cookielib"? Dlaczego ktoś miałby chcieć używać jednego na drugim? – n611x007

Powiązane problemy