[英]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_error
和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_response
和result
參數
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.