簡體   English   中英

Python Tornado 響應 GET 請求

[英]Python Tornado respond to GET request

我可能誤解了一些非常基本的東西。 我一般是龍卷風和網絡服務器的新手。 我使用了一些教程和大量的谷歌搜索來開始,但我仍然發現自己被基礎知識困住了。

情況

我在帶有 tornado 6.0.4 的 Ubuntu 18.04 服務器上使用 python 3.6.9。 我有一個tornado.web.RequestHandler服務器,它通過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)但我猜這是不對的,因為它要求我提供一個可調用的函數。

我想要發生的事情

我想將計算出的數據發送回請求它的客戶端。

在此先感謝您提供的任何幫助。 我知道我可能誤解了龍卷風的基本原理或它是如何工作的,但我找不到任何專門解決這個問題的地方。

查看官方文檔

RequestHandler中的許多方法被設計為在子類中被覆蓋並在整個應用程序中使用。 通常定義一個BaseHandler類來覆蓋諸如write_errorget_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)

所以我錯過了最基本的東西。 顯然在 Tornado self.write({"data_name":data})中的 get() 函數將返回數據。

現在我仍然遇到無法返回字節數據的問題(我的情況發生了變化,現在我需要將 numpy 數組轉換為 wav 文件並發送 wav 文件)並且我收到了一個不同的錯誤Object of type 'bytes' is not JSON serializable但如果我無法弄清楚,我將為它打開一個新問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM