22

我正在尝试使用 Tornado 启动服务器并向其发布字符串。我找到了很多关于如何在处理程序类中编写 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”参数中是正确的做法吗?在我见过的一些示例中,例如这里,似乎人们创建了自己的参数,但是如果我尝试向请求中添加新参数,例如

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

我只是收到一条错误消息“TypeError: init () got an unexpected keyword argument 'data'”

谢谢!

4

1 回答 1

40

似乎人们创建了自己的参数

不完全的。从文档:

获取(请求,**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 回答