0

我目前遇到的问题是,我希望能够基于在我的 python 后端中运行的函数在我的前端以 JavaScript/HTML 显示某种进度(条)。为此,我在后端定义了一个“计数器”变量来跟踪我的进度。我现在唯一的问题是获取这个计数器变量作为对前端发布请求的响应。这意味着,虽然由后端的发布请求触发的方法仍在运行,但我希望我的发布请求能够获得包含我的计数器变量的响应正文,该变量应该不断更新。

目前我的请求如下所示:

function runMethod(){
  $.ajax({
  url: "url:port/runMethod",
  type: 'POST',
  async: true,
  data: 
      JSON.stringify({
          'somedata': someData     
  }),
  success: function (my_data) {
    logger(my_data)
  },
  error: function() {
    alert("error running method");
     }
  })
}

function logger(my_data){
  var logged = my_data['counter'];
  document.getElementById('myprogress').innerHTML = logged;
  console.log(logged);
}

以及我在 python API 中处理 post 请求的方式,如下所示:

class MyServer(BaseHTTPRequestHandler):
    def __init__(self, request: bytes, client_address, server) -> None:
        self.classes = {t.__name__: t for t in all_classes}
        #self.ldp_experiment = None
        super().__init__(request, client_address, server)

    def do_POST(self):
        # Send our response code, header, and data
        self.send_response(200)
        self.send_header("Content-type", "Application/json")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header('Access-Control-Allow-Headers', 'Content-Type, Accept')
        
        body = self.rfile.read(int(self.headers['Content-Length']))
        print(body)
        try:
            body = json.loads(body)
        except ValueError:
            pass

        if self.path.startswith('/runMethod'):
        contentType = 'application/json'
        logging.info('Running Method...')
        func1 = somefunc(body['somedata'])
        my_progress = someclass.progress_variable
        response = json.dumps({'counter':[my_progress]})

        self.end_headers()
        self.wfile.write(response.encode('UTF-8'))

    if __name__ == "__main__":        
        webServer = HTTPServer(("", serverPort), MyServer)
        print("Server started http://%s:%s" % ("", serverPort))

        try:
             webServer.serve_forever()
        except KeyboardInterrupt:
             pass

        webServer.server_close()
        print("Server stopped.")

我看到一些帖子建议使用 setInterval() 或 setTimeout() 多次运行请求,这可以让我更频繁地获取计数器变量作为响应,但该函数也会更频繁地运行,这有点违背了整个目的。

任何人都知道我可以做些什么来在我的前端获得这个进度变量?

4

0 回答 0