2012-04-28 22 views
18

Estoy tratando de usar Tornado para iniciar un servidor y publicar una cadena en él. He encontrado muchos ejemplos de cómo escribir el método de publicación en la clase de controlador, pero no hay ejemplos de cómo escribir la solicitud de publicación. Mi código actual hace que se ejecute el método de publicación, pero get_argument no obtiene los datos, solo imprime el valor predeterminado "Sin datos recibidos" cada vez. ¿Qué estoy haciendo mal?¿Cómo usar el método POST en Tornado?

Mi código es el siguiente:

class MainHandler(tornado.web.RequestHandler): 
    def post(self): 
     data = self.get_argument('body', 'No data received') 
     self.write(data) 

application = tornado.web.Application([ 
    (r"/", MainHandler), 
]) 

if __name__ == "__main__": 

    def handle_request(response): 
     if response.error: 
      print "Error:", response.error 
     else: 
      print response.body 
     tornado.ioloop.IOLoop.instance().stop() 

    application.listen(8888)  
    test = "test data" 
    http_client = tornado.httpclient.AsyncHTTPClient() 
    http_client.fetch("http://0.0.0.0:8888", handle_request, method='POST', headers=None, body=test) 
    tornado.ioloop.IOLoop.instance().start() 

está poniendo la cadena Quiero enviar en el "cuerpo" Parameter lo que hay que hacer? En algunos ejemplos que he visto, como here, parece que la gente crear sus propios parámetros, pero si intento agregar un nuevo parámetro a la solicitud, al igual que

http_client.fetch("http://0.0.0.0:8888", handle_request, method='POST', headers=None, data=test) 

apenas consigo un error que dice "TypeError: init() obtuvo una inesperada palabra clave argumento 'datos' "

¡Gracias!

Respuesta

32

it seems people create their own parameters

Not quite. A partir de los documentos:

fetch(request, **kwargs)

Executes a request, returning an HTTPResponse.

The request may be either a string URL or an HTTPRequest object. If it is a string, we construct an HTTPRequest using any additional kwargs: HTTPRequest(request, **kwargs)

(Link)

Así las kwargs son en realidad de this method.

De todos modos, a la verdadera causa del problema: ¿cómo se envían los datos POST? Estabas en el camino correcto, pero necesitas codificar en la URL tus datos POST y usarlos como tu cuerpo kwarg. De esta manera:

import urllib 
post_data = { 'data': 'test data' } #A dictionary of your post data 
body = urllib.urlencode(post_data) #Make it into a post request 
http_client.fetch("http://0.0.0.0:8888", handle_request, method='POST', headers=None, body=body) #Send it off! 

Luego de obtener los datos:

data = self.get_argument('data', 'No data received') 
+0

exactamente lo que necesitaba, gracias! – user1363445

Cuestiones relacionadas