miércoles, febrero 04, 2009

Cookies en python

Ando haciendo un servicio que hace uso de urllib2.
Sobre urllib2 recomendar este tutorial. Es realmente bueno; asi como los demas del mismo sitio.

Cuando abres una url, con urlopen, se hace uso de una serie de openers por defecto, entre los que no se encuentra el que maneja los cookies. Sobre este tema os recomiendo esta página.

Haciendo unas pruebecillas, sin usar HTTPCookieProcessor, obtenia las siguientes cabeceras en una respuesta:


Connection: close
Content-Length: 159
Via: 1.1 PUBLICO2
Date: Wed, 04 Feb 2009 15:42:11 GMT
Location: http://www.8a.nu/login/SessionTimeOut.aspx
Content-Type: text/html; charset=iso-8859-1
Server: Microsoft-IIS/6.0
Cache-Control: private
X-Powered-By: ASP.NET
X-Aspnet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=h5iruz45bl041xrvrhbn1tmk; path=/; HttpOnly


Como podeis ver, el cookie está al final. Pues bien, si incluimos el opener para el cookie, si imprimo de nuevo los headers, está información ha sido extraida. Y no sólo la del cookie, sino la 'Location'.


Connection: close
Content-Length: 1235
Via: 1.1 PUBLICO2
Date: Wed, 04 Feb 2009 15:42:11 GMT
Content-Type: text/html; charset=iso-8859-1
Server: Microsoft-IIS/6.0
Cache-Control: private
X-Powered-By: ASP.NET
X-Aspnet-Version: 2.0.50727


Estas trazas las he imprimido metiendo unas trazas en el método http_response de HTTPCookieProcessor:



def http_response(self, request, response):
self.cookiejar.extract_cookies(response, request)
return response


Lo mas estraño es que las trazas me salian un par de veces!!! La primera con la informacion sin eliminar, y la segunda con ella eliminada. No se el porqué.

Si queremos acceder a la información de los cookies, lo podemos hacer a traves de la instancia del cookie processor. Ejemplo:


cookieProcessor = urllib2.HTTPCookieProcessor()
urllib2.install_opener(urllib2.build_opener(cookieProcessor))
...
print cookieProcessor.cookiejar._cookies


_cookies es un diccionario, indexado por dominio. El valor es otro diccionario indexado por rutas.
Os muestro un ejemplo:


{'www.8a.nu': {'/': {'ASP.NET_SessionId': Cookie(version=0, name='ASP.NET_SessionId', value='1agr3qatdwhvin3en2d4ye45', port=None, port_specified=False, domain='www.8a.nu', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)}}}


La 'Location' que desaparece de los headers, se puede obtener con el método geturl de la respuesta. Ah! y los header con el método info.

Postada
Un tutorial que también recomiendo leer es el de Autentificación: Basic Authentication.

No hay comentarios: