Hola jose,<br><br>Seria interesante que enviaras el mensaje de error para tener mas informacion<br><br>A veces es muy util activar el modo debuglevel en el opener:<br><br>opener = urllib2.build_opener(<br> HTTPSClientAuthHandler('/tmp/pem_certificate', '/tmp/pem_certificate'),<br>
urllib2.HTTPHandler(debuglevel=1)<br> )<br><br>según la documentación, urllib2.urlopen envia conexiones HTTP/1.1 con Connection:close en el header<br><a href="http://docs.python.org/library/urllib2.html#urllib2.urlopen">http://docs.python.org/library/urllib2.html#urllib2.urlopen</a><br>
<br>Por lo que creo que el problema está en que cada llamada a connect se abre una nueva sesion y por eso en la segunda conexión no estas autenticado.<br><br>En estos casos normalmente no utilizo urlopen sino que como ya tienes el opener, utilizo request= urllib2.Request para crear el request, esto permite personalizar los headers mediante request.add_header y añadir los datos mediante request.add_data. <br>
<br>Una vez que el request tiene toda la información necesaria, haces la llamada mediante opener.open(request).read().<br><br>Esto se ha de repetir para cada consulta<br><br>Ejemplo:<br><br>opener = urllib2.build_opener(<br>
HTTPSClientAuthHandler('/tmp/pem_certificate', '/tmp/pem_certificate'),<br> urllib2.HTTPHandler(debuglevel=1)<br> )<br><br># primera conexion<br>req = urllib2.Request(url)<br># ... añadir el data ...<br>
req.add_data(data1)<br>print opener.open(req).read()<br><br># segunda conexion<br>req = urllib2.Request(url)<br># ... añadir el data ...<br>req.add_data(data2)<br>print opener.open(req).read()<br><br>Todo esto seria interesante implementarlo en una clase Client que conserve la sesión y que permita hacer las llamadas necesarias según se requiera<br>
<br>Por cierto, si te ha sido útil y encuentras la solución, te agradecería que lo publicaras en el hilo, para mi es interesante las comunicaciones entre servicios web y intercambiar las experiencias nos permite a todos profundizar en el tema<br>
<br>Un saludo<br><br><div class="gmail_quote">El 21 de enero de 2011 21:18, Jose Caballero <span dir="ltr"><<a href="mailto:jcaballero.hep@gmail.com">jcaballero.hep@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Hola,<br><br>necesito enviar ciertos datos a un servidor mediante el método POST, y analizar la respuesta que el servidor me devuelve. <br>Este proceso se realiza varias veces, pasando distinta información en cada comunicación. <br>
<br>La comunicación se debe autenticar mediante un certificado PEM. <br><br>Lo estoy intentando con urllib/urllib2, con un código más o menos como el siguiente (parte copiado de un blog que encontré en google):<br><br>------------------------------------------------------------------------------------------------------------------------------<br>
<br>import urllib<br>import urllib2 <br>import httplib <br><br><br>def connect(url, data):<br><br> class HTTPSClientAuthHandler(urllib2.HTTPSHandler):<br> def __init__(self, key, cert):<br> urllib2.HTTPSHandler.__init__(self)<br>
self.key = key<br> self.cert = cert<br> <br> def https_open(self, req):<br> # Rather than pass in a reference to a connection class, we pass in<br> # a reference to a function which, for all intents and purposes,<br>
# will behave as a constructor<br> return self.do_open(self.getConnection, req)<br> <br> def getConnection(self, host, timeout=300):<br> return httplib.HTTPSConnection(host, key_file=self.key, cert_file=self.cert)<br>
<br> opener = urllib2.build_opener(HTTPSClientAuthHandler('/tmp/pem_certificate', '/tmp/pem_certificate') )<br> urllib2.install_opener(opener)<br> urlhandler = urllib2.urlopen(url, urllib.urlencode(data))<br>
ret = urlhandler.read()<br> <br> return ret<br><br><br>ret1 = connect(url, data1)<br>print ret1<br><br>ret2 = connect(url, data2)<br>
print ret2<br>
<br>
ret3 = connect(url, data3)<br>print ret3<br>
<br>------------------------------------------------------------------------------------------------------------------------------<br><br>Mi problema es que sólo la primera conexión funciona. <br>Para la segunda y la tercera el servidor me devuelve un mensaje de error. <br>
Este mensaje, algo críptico, viene a decir que estoy estableciendo una comunicación sin autenticar. <br>Sin embargo, el fichero PEM sigue ahí, uso el mismo para las tres conexiones. <br>¿Por qué funciona la primera vez y no las demás?<br>
Nota: no tengo acceso a los logs del servidor. Sólo sé lo que me devuelve como mensaje de error. <br><br>Lo único que se me ocurre es algún problema de conexiones abiertas que deberían haber sido cerradas o algo similar. <br>
<br>Si alguien me puede dar alguna pista estaré eternamente agradecido. <br><br>
<br>
Muchas gracias por adelantando.<br><font color="#888888">Jose<br><br><br><br><br><br><br>
</font><br>_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org">Python-es@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-es" target="_blank">http://mail.python.org/mailman/listinfo/python-es</a><br>
FAQ: <a href="http://python-es-faq.wikidot.com/" target="_blank">http://python-es-faq.wikidot.com/</a><br>
<br></blockquote></div><br><br clear="all"><br>-- <br>//////////////////////////////////////////////////////////////////////////<br>Eduard Díaz<br><a href="http://www.scopia.es">www.scopia.es</a><br>SCOPIA VISUAL INTERFACES SYSTEMS S.L.<br>
Barcelona<br>Tel. 625 055 126, 933 171 771<br>//////////////////////////////////////////////////////////////////////////<br>