2012-04-28 23 views
18

Próbuję użyć Tornado, aby uruchomić serwer i napisać do niego ciąg znaków. Znalazłem wiele przykładów, jak napisać metodę post w klasie obsługi, ale nie ma przykładów, jak napisać żądanie wpisu. Mój obecny kod powoduje, że metoda postu jest wykonywana, ale get_argument nie pobiera danych - po prostu wypisuje domyślne "No data received" za każdym razem. Co ja robię źle?Jak korzystać z metody POST w Tornado?

Mój kod wygląda następująco:

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

jest oddanie ciąg Chcę wysłać w „ciele” Parametr słuszne? W niektórych przykładach widziałem, jak here, wydaje się ludzie tworzą swoje własne parametry, ale gdy próbuję dodać nowy parametr do wniosku, jak

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

ja po prostu błąd, mówiąc: „TypeError: init() uzyskał nieoczekiwany argument słowa kluczowego "dane" "

Dzięki!

Odpowiedz

32

it seems people create their own parameters

Niezupełnie. Od docs:

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)

Więc kwargs są faktycznie od this method.

W każdym razie, do prawdziwego mięsa problemu: w jaki sposób wysyłasz dane POST? Byłeś na dobrej drodze, ale musisz zakodować kod pocztowy swoich danych POST i użyć go jako swojego kwarg. Tak:

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! 

Następnie, aby uzyskać dane:

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

dokładnie to, co potrzebne, dzięki! – user1363445

Powiązane problemy