2011-01-13 25 views
11

¿Cómo creo una cookie y la agrego a una instancia de CookieJar en python? Tengo toda la información para la cookie (nombre, valor, dominio, ruta, etc.) y no quiero extraer una nueva cookie con una solicitud http.python - agregar cookie a cookiejar

He intentado esto, pero se parece a la clase SimpleCookie no es compatible con CookieJar (¿hay otra clase 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

¿Cuál es el contexto en el que está usando esto? Esto se ha vuelto a implementar mucho en python web serving y request frameworks. –

Respuesta

11

En cuanto a cookielib, se obtiene:

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 

Da:

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

No existen verdaderos controles de cordura para los parámetros de creación de instancias. Los puertos deben ser cadenas, no int.

+0

si bien es cierto, esto no toca si el módulo 'Cookie' se puede hacer compatible con el módulo' cookielib', o si no. – n611x007

+1

Probablemente solo crearía un propio tipo 'Cookie' en ese caso, que ofrece ambas interfaces. Cookiejar no es muy exigente con lo que se obtiene como una cookie. La nueva cookie solo requiere los atributos 'domain',' path' y 'name' y no debe tener' items'. Eso es básicamente Las partes internas de 'cookielib' son realmente algo ligero, fácil de digerir y una lectura muy recomendada. – Michael

+0

Acabo de notar que Cookie() toma 15 parámetros y usted proporciona 16 cuando lo llama. ¿Es esto un error tipográfico? – reedog117

2

El punto crucial aquí es que el método cj.set_cookie espera un objeto de clase cookielib.Cookie como parámetro (por lo sí, hay otra clase Cookie), no un objeto de clase Cookie.SimpleCookie (o cualquier otra clase que se encuentra en el módulo Cookie). Estas clases (como se observa) simplemente no son compatibles, a pesar de la similitud confusa de los nombres.

Tenga en cuenta que la lista de parámetros del constructor para cookielib.Cookie podría haber cambiado en algún punto en el pasado (y podría cambiar nuevamente en el futuro ya que no se espera que esta clase se use fuera de cookielib), al menos help(cookielib.Cookie) actualmente me da

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

Nota del expires parámetro adicional y el parámetro utilizado rfc2109 pero no documentado en el código de @ respuesta de Michael es arriba, es el ejemplo debería ser algo así como

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

(también reemplazando algunas constantes booleanas para None donde corresponda).

+0

si estos dos son incompatibles, ¿qué módulos están utilizando alguno de ellos, respectivamente? p.ej. ¿'Cookie' es compatible con cualquier módulo de biblioteca estándar? ¿Qué hay de 'cookielib'? ¿Por qué debería uno querer usar uno sobre el otro? – n611x007

Cuestiones relacionadas