トルネードを使用してサーバーを起動し、サーバーに文字列を投稿しようとしています。ハンドラクラスで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'を取得した」というエラーが表示される
ありがとう!
人々は独自のパラメータを作成しているようです
結構です。ドキュメントから:
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')