22

Tornado を使用してサーバーを起動し、文字列を投稿しようとしています。ハンドラー クラスでポスト メソッドを記述する方法の例はたくさん見つかりましたが、ポスト リクエストを記述する方法の例はありません。私の現在のコードでは 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」パラメーターに入れるのは正しいことですか? hereのように、私が見たいくつかの例では、人々が独自のパラメーターを作成しているように見えますが、リクエストに新しいパラメーターを追加しようとすると、

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

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

ありがとう!

4

1 に答える 1

40

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

そうではありません。ドキュメントから:

fetch(リクエスト, **kwargs)

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

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

(リンク)

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

とにかく、問題の本質に迫ってみましょう: POST データをどのように送信しますか? あなたは正しい軌道に乗っていましたが、POST データを URL エンコードし、それを body 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')
于 2012-04-29T01:51:31.590 に答える