【问题标题】:Python Tornado respond to GET requestPython Tornado 响应 GET 请求
【发布时间】:2020-10-14 12:37:21
【问题描述】:

我可能误解了一些非常基本的东西。我一般是龙卷风和网络服务器的新手。我使用了一些教程和大量谷歌搜索来开始使用,但我仍然发现自己停留在基础知识上。

情况

我在带有 tornado 6.0.4 的 Ubuntu 18.04 服务器上使用 python 3.6.9。 我有一个龙卷风服务器,它通过 tornado.web.RequestHandler 类 get () 函数接受 GET 请求并对其进行一些计算。这一切正常。
我需要 tornado 服务器将结果(一个 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),但我猜这是不对的,因为它要求我提供一个可调用函数。

我想要发生的事情

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

提前感谢您提供的任何帮助。我知道我可能误解了龙卷风的基本用途或工作原理,但我找不到任何专门解决这个问题的地方。

【问题讨论】:

    标签: python python-3.x tornado


    【解决方案1】:

    official documentation:

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

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

    看一个简单的例子:

    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_responseresult 参数

    data = ['foo', {'bar': ('baz', None, 1.0, 2)}]
    self.write_response(status_code=HTTPStatus.OK, result=data)
    
    # and so you will send to the client:
    ["foo", {"bar": ["baz", null, 1.0, 2]}]
    
    # or
    your_numpy_list = your_numpy_object.tolist()
    self.write_response(status_code=HTTPStatus.OK, result=your_numpy_list)
    

    【讨论】:

    • 一般来说,我建议使用两个 BaseHandler。一种用于 API / JSON 数据。另一个用于 HTML(模板)渲染。
    【解决方案2】:

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

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

    【讨论】:

    • 您不能在 JSON 对象中发送二进制 ('bytes') 数据。 JSON 不支持。将其转换为 base64 并发送。
    • 谢谢。我最终只是没有将它作为 JSON 发送,而且效果很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2020-07-10
    • 2014-07-28
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多