2012-04-28 4 views
18

Я пытаюсь использовать Tornado для запуска сервера и отправки строки к нему. Я нашел много примеров того, как написать метод post в классе обработчика, но нет примеров того, как писать пост-запрос. Мой текущий код вызывает метод post, но get_argument не получает данные - он просто печатает по умолчанию «No data received» каждый раз. Что я делаю не так?Как использовать метод POST в Торнадо?

Мой код выглядит следующим образом:

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

помещает строку, я хочу, чтобы отправить в «тело» параметр правильно делать? В некоторых примерах, которые я видел, как here, кажется, что люди создают свои собственные параметры, но если я пытаюсь добавить новый параметр в запросе, как

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

Я просто получаю сообщение об ошибке сказав «TypeError: init() получил неожиданное ключевое слово аргумент 'data' '

Спасибо!

ответ

32

it seems people create their own parameters

Не совсем. Из документов:

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)

Так kwargs фактически от this method.

В любом случае, к реальному мясу проблемы: как вы отправляете данные POST? Вы были на правильном пути, но вам нужно кодировать данные POST и использовать это как ваше тело kwarg. Как это:

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! 

Затем, чтобы получить данные:

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

именно то, что мне нужно, спасибо! – user1363445

Смежные вопросы