Python Tornado响应GET请求

时间:2020-10-14 12:37:21

标签: python python-3.x tornado

我可能误解了一些非常基本的东西。我是龙卷风和Web服务器的新手。我使用了一些教程和很多谷歌搜索入门,但是我仍然发现自己陷于基础。

情况

我在具有龙卷风6.0.4的Ubuntu 18.04服务器上使用python 3.6.9。 我有一个龙卷风服务器,它通过tornado.web.RequestHandler类get()函数接受GET请求,并对其进行一些计算。这一切都正常工作。
我需要龙卷风服务器将结果(一个numpy数组)返回给发送请求的客户端。
据我所知,我所做的一切都是同步的,因为我自己没有添加任何异步代码。

我的代码简而言之:

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        base_data = self.get_argument("base_data")
        compute_data(base_data)
        #Here I want to return the data back to the client

application = tornado.web.Application(handlers=[ (r"/calculator", MainHandler)])

if __name__ == "__main__":
    http_server=tornado.httpserver.HTTPServer(application)
    http_server.listen(__PORT__)
    tornado.ioloop.IOLoop.instance().start()

问题

我没有有关客户端的信息。
我没有任何想法,也找不到任何教程来解释如何从GET请求中回复客户端。

我尝试过的

我尝试在get()函数末尾简单地返回np.array,但是得到了:
TypeError: object numpy.ndarray can't be used in 'await' expression
我以为我需要做的是向客户端发出POST请求,但是我(不知道)没有客户端的IP和端口。
我还随机发现也许应该使用tornado.ioloop.IOLoop.current().spawn_callback(data),但是我猜那是不对的,因为它要求我提供可调用的函数。

我想发生的事情

我想将计算出的数据发送回请求它的客户端。

在此先感谢您提供任何帮助。我知道我可能误解了龙卷风的含义或工作原理,但是我找不到任何专门解决此问题的地方。

2 个答案:

答案 0 :(得分:1)

official documentation

<块引用>

expenses 中的许多方法被设计为在 子类并在整个应用程序中使用。这是常见的 定义一个 RequestHandler 类来覆盖 BaseHandler 等方法 和 write_error 然后子类化你自己的 get_current_user 而不是 BaseHandler 用于所有特定处理程序。

因此,在您的示例中,还可以编写一个 RequestHandler 方法,该方法可以更轻松地在 MainHandler 以及其他处理程序中编写响应。

看一个简单的例子:

write_response

如果您返回给客户端的 from tornado.web import RequestHandler from http import HTTPStatus import json class BaseHandler(RequestHandler): def write_response(self, status_code, result=None, message=None): self.set_status(status_code) if result: self.finish(json.dumps(result)) elif message: self.finish(json.dumps({ "message": message })) elif status_code: self.set_status(status_code) self.finish() class MainHandler(BaseHandler): def get(self): self.write_response(status_code=HTTPStatus.OK, message='Hello calculator!') 是以下形式,则使用带有 data 参数的 write_response

result

答案 1 :(得分:0)

所以我错过了最基本的东西。 显然,在get()函数的Tornado self.write({"data_name":data})中会返回数据。

现在我仍然遇到无法返回字节数据的问题(我的情况已经改变,现在我需要将numpy数组转换为wav文件并发送到wav文件中),但我得到了一个不同的结果错误Object of type 'bytes' is not JSON serializable,但如果我无法弄清楚,我将为此提出一个新问题。