2011-01-13 14 views
11

Wie erstelle ich einen Cookie und füge ihn zu einer CookieJar-Instanz in Python hinzu? Ich habe alle Informationen für den Cookie (Name, Wert, Domäne, Pfad, etc) und ich möchte kein neues Cookie mit einer HTTP-Anfrage extrahieren.python - Cookie zu cookiejar hinzufügen

Ich versuchte dies aber es sieht aus wie SimpleCookie Klasse mit CookieJar nicht kompatibel ist (? Gibt es eine andere Cookie-Klasse)

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

In welchem ​​Kontext verwenden Sie das? Dieses Zeug wurde in Python Web Serving und Request Frameworks sehr oft neu implementiert. –

Antwort

11

bei cookielib Sehen, erhalten Sie:

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 

Gibt:

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

Es gibt keine echten Plausibilitätsprüfungen für die Instanziierungsparameter. Die Ports müssen Strings sein, nicht int.

+0

wahr, dies berührt nicht, ob das 'Cookie'-Modul mit dem' cookielib'-Modul kompatibel gemacht werden kann oder nicht. – n611x007

+1

Wahrscheinlich würden Sie in diesem Fall nur einen eigenen Cookie-Typ erstellen, der beide Schnittstellen bietet. Cookiejar ist nicht wirklich wählerisch, was es als Cookie bekommt. Der neue Cookie benötigt nur die Attribute 'domain',' path' und 'name' und darf keine' items' enthalten. Das ist es im Grunde. "cookielib" Interna sind wirklich eine leichte Vorlesung, leicht zu verdauen und eine sehr empfehlenswerte Lektüre. – Michael

+0

Ich habe gerade bemerkt - Cookie() dauert 15 Parameter, und Sie liefern 16, wenn Sie es aufrufen. Ist das ein Tippfehler? – reedog117

2

hier Der entscheidende Punkt, dass Methode ist cj.set_cookie ein Objekt der Klasse erwartet cookielib.Cookie als Parameter (so ja, gibt es eine andere Cookie-Klasse), nicht ein Objekt der Klasse Cookie.SimpleCookie (oder jede andere Klasse im Modul gefunden Cookie). Diese Klassen sind (wie beobachtet) einfach nicht kompatibel, trotz der verwirrenden Ähnlichkeit der Namen.

Beachten Sie, dass die Parameterliste des Konstruktor für cookielib.Cookie könnte irgendwann in der Vergangenheit geändert hat (und vielleicht wieder in der Zukunft ändern, da diese Klasse scheint nicht zu erwarten, außerhalb von cookielib verwendet werden sollte), zumindest help(cookielib.Cookie) gibt zur Zeit mir

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

Beachten Sie die zusätzlichen expires Parameter und der Parameter rfc2109 verwendet, aber nicht in @ Michaels Antwort oben im Code dokumentiert, so dass das Beispiel sollte so etwas wie

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

(ersetzt auch einige boolesche Konstanten für None, wo zutreffend).

+0

Wenn diese beiden nicht kompatibel sind, welche Module verwenden sie jeweils? z.B. Ist 'Cookie' mit jedem Standard-Bibliotheksmodul kompatibel? Was ist mit 'cookielib'? Warum sollte man eins über das andere benutzen wollen? – n611x007

Verwandte Themen