2011-01-13 20 views
11

Come posso creare un cookie e aggiungerlo a un'istanza di CookieJar in python? Ho tutte le informazioni per il cookie (nome, valore, dominio, percorso, ecc.) E non voglio estrarre un nuovo cookie con una richiesta http.python - aggiungi cookie a cookiejar

Ho provato questo ma sembra di classe SimpleCookie non è compatibile con Cookiejar (? C'è un'altra classe 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

Qual è il contesto in cui lo stai utilizzando? Questa roba è stata reimplementata molto nel servizio web di Python e nei framework delle richieste. –

risposta

11

Guardando cookielib, si ottiene:

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 

Gives:

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

Non ci sono veri controlli di integrità per i parametri di istanziazione. Le porte devono essere stringhe, non int.

+0

mentre True, questo non tocca se il modulo 'Cookie' può essere reso compatibile con il modulo' cookielib', o meno. – n611x007

+1

Probabilmente dovresti creare un proprio tipo 'Cookie' in quel caso, che offre entrambe le interfacce. Cookiejar non è davvero schizzinoso su ciò che ottiene come cookie. Il nuovo cookie richiede solo gli attributi 'domain',' path' e 'name' e non deve avere' items'. Questo è fondamentalmente. Gli interni di 'cookielib' sono in realtà una lezione leggera, facile da digerire e una lettura molto raccomandata. – Michael

+0

Ho appena notato che Cookie() richiede 15 parametri e ne fornisce 16 quando lo si chiama. È un errore? – reedog117

2

Il punto cruciale è che il metodo cj.set_cookie prevede un oggetto di classe cookielib.Cookie come parametro (così sì, c'è un'altra classe Cookie), non un oggetto della classe Cookie.SimpleCookie (o qualsiasi altra classe trovata nel modulo Cookie). Queste classi sono (come osservato) semplicemente non compatibili, nonostante la confusa somiglianza dei nomi.

Si noti che l'elenco dei parametri del costruttore per cookielib.Cookie potrebbe essere stato modificato in qualche punto nel passato (e potrebbe cambiare in futuro in quanto questa classe non sembra essere prevista per essere utilizzata al di fuori di cookielib), almeno help(cookielib.Cookie) attualmente mi dà

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

osservino i expires parametro e il parametro di rfc2109 utilizzato, ma non documentato nel codice in @ risposta di Michael in alto, così l'esempio dovrebbe diventare qualcosa di simile

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

(sostituendo anche alcune costanti booleane per None dove applicabile).

+0

se questi due sono incompatibili, quali moduli usano rispettivamente uno di questi? per esempio. è 'Cookie' compatibile con qualsiasi modulo di libreria standard? che dire di 'cookielib'? Perché dovremmo volerne usare uno sull'altro? – n611x007