[Python-es] "parsear" los datos de 'input' en una llamada HTTP POST con SimpleHTTPServer.SimpleHTTPRequestHandler

Carlos Zuniga carlos.zun en gmail.com
Mar Nov 6 22:26:01 CET 2012


2012/11/6 Jose Caballero <jcaballero.hep en gmail.com>:
>
>
> El 6 de noviembre de 2012 14:55, Carlos Zuniga <carlos.zun en gmail.com>
> escribió:
>
>> 2012/11/6 Jose Caballero <jcaballero.hep en gmail.com>:
>> > Hola,
>> >
>> >
>> >
>> > como ejercicio puramente didáctico (por ahora) estoy haciendo algunas
>> > pruebas con las classes SimpleHTTP* que trae python [tiene que ser
>> > python2.4].
>> > He conseguido arrancar un servicio httpd, y puedo navegar con un
>> > 'browser'
>> > por los directorios.
>> > También he averiguado cómo modificar el 'output', escribiendo el
>> > contenido
>> > en self.wfile
>> >
>> > No he sido capaz de averiguar cómo "parsear" los datos de 'input' en
>> > caso de
>> > una llamada POST.
>> > He añadido un método do_POST():
>> >
>> >
>> > class
>> > MySimpleHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
>> >     ...
>> >     def do_POST(self):
>> >         ...
>> >         self.wfile.write( 'mundo\n' )
>> >
>> >
>> > Efectivamente, luego puedo hacer
>> >
>> >       $ curl -d hola http://www.myserver.net:1234
>> >       mundo
>> >       $
>> >
>> > Sin embargo no he sido capaz de averiguar cómo quedarme con los datos de
>> > 'input' en una variable. En este caso sencillo simplemente 'hola', pero
>> > podría ser algo más complejo (por ejemplo un diccionario).
>> > Lo estoy intentando con la clase cgi, pero no lo consigo.
>> > No sé si el problema está en el comando curl en si mismo, que no está
>> > completo, o que aún no he encontrado el método de la clase cgi adecuado.
>> >
>> > Cualquier pista que me puedan dar será más que bien recibida.
>>
>> Los datos que se envía por un formulario POST se encuentran en los
>> headers del request. Dentro de tu método do_POST deberías poder
>> acceder a self.headers (que es un objeto del tipo MessageClass) para
>> ver los datos:
>>
>> http://docs.python.org/2/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.headers
>>
>
>
> Ya había intentado esa vía. Sin embargo, si hago  print self.headers en
> do_POST(), esto es lo que obtengo:
>
>
> User-Agent: curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5
> OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
> Host: www.myserver.net:1234
> Pragma: no-cache
> Accept: */*
> Content-Length: 4
> Content-Type: application/x-www-form-urlencoded
> Connection: Keep-Alive
> X-BlueCoat-Via: F7D3AB2CA1943FBA
>
>
> No veo el 'input' por ninguna parte.

Ok, parece que toda esa data la tiene en self.rfile, prueba con esto:

def do_POST(self):
    l = int(self.headers['Content-Length'])
    print self.rfile.read(l)

--
A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos
de leer manuales.


Más información sobre la lista de distribución Python-es