Подтвердить что ты не робот

Как использовать метод POST в Tornado?

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

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

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

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

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

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

Спасибо!

4b9b3361

Ответ 1

Кажется, люди создают свои собственные параметры

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

выборка (запрос, ** kwargs)

Выполняет запрос, возвращая HTTPResponse.

Запрос может быть либо строковым URL, либо объектом HTTPRequest. Если оно является строкой, мы строим HTTPRequest, используя любые дополнительные kwargs: HTTPRequest (запрос, ** kwargs)

(Ссылка)

Итак, kwargs на самом деле от этот метод.

В любом случае, к реальному мясу проблемы: как вы отправляете данные 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')