2012-04-28 5 views
18

Sto provando a usare Tornado per avviare un server e inserirvi una stringa. Ho trovato molti esempi su come scrivere il metodo post nella classe del gestore, ma nessun esempio su come scrivere la richiesta di post. Il mio codice corrente causa l'esecuzione del metodo post, ma get_argument non sta ottenendo i dati - stampa solo l'impostazione predefinita "Nessun dato ricevuto" ogni volta. Che cosa sto facendo di sbagliato?Come utilizzare il metodo POST in Tornado?

Il mio codice è simile al seguente:

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

sta mettendo la stringa Voglio inviare nel "corpo" parametro la cosa giusta da fare? In alcuni esempi che ho visto, come here, sembra che la gente creare i propri parametri, ma se provo ad aggiungere un nuovo parametro per la richiesta, come

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

ottengo solo un errore che dice "TypeError: init() ottenuto un argomento parola chiave "dati" imprevisto "

Grazie!

risposta

32

it seems people create their own parameters

Non proprio. Dalla documentazione:

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)

Così i kwargs sono in realtà da this method.

In ogni caso, il vero problema del problema: come si inviano i dati POST? Eri sulla strada giusta, ma hai bisogno di url codificare i tuoi dati POST e usarli come kwarg del tuo corpo. Come questo:

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! 

Quindi per ottenere i dati:

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

esattamente quello che mi serviva, grazie! – user1363445