web-dev-qa-db-ja.com

トルネードでPOSTメソッドを使用する方法?

トルネードを使用してサーバーを起動し、サーバーに文字列を投稿しようとしています。ハンドラクラスでpostメソッドを記述する方法の例はたくさんありますが、postリクエストを記述する方法の例はありません。現在のコードではpostメソッドが実行されますが、get_argumentはデータを取得していません。毎回デフォルトの「データが受信されていません」を出力するだけです。何が悪いのですか?

私のコードは次のようになります:

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」パラメータに入れるのは正しいことですか? here のようないくつかの例では、人々が独自のパラメーターを作成しているようですが、リクエストに新しいパラメーターを追加しようとすると、

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

「TypeError:init()が予期しないキーワード引数 'data'を取得した」というエラーが表示される

ありがとう!

21
user1363445

人々は独自のパラメータを作成しているようです

結構です。ドキュメントから:

fetch(request、** kwargs)

リクエストを実行し、HTTPResponseを返します。

リクエストは、文字列URLまたはHTTPRequestオブジェクトのいずれかです。文字列の場合、追加のkwargsを使用してHTTPRequestを作成します:HTTPRequest(request、** kwargs)

リンク

したがって、kwargsは実際には このメソッド からのものです。

とにかく、問題の本当の意味で:POSTデータをどのように送信しますか?あなたは正しい軌道に乗っていましたが、POSTをURLエンコードする必要がありますデータを取得し、それをボディカーグとして使用します。

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')
37
Theron Luhn