【问题标题】:Getting Python HttpServer response instantly立即获得 Python HttpServer 响应
【发布时间】:2018-10-12 05:06:18
【问题描述】:

我在服务器端使用Python HttpServer。一个GET 请求将需要更多时间来响应,我想向用户更新它的当前状态,例如'Fetching module X. Please wait''Fetching module Y. Please wait'

但是,即使我在模块之间发送它,它也没有在客户端更新。我已经尝试刷新流,但没有运气。

self.wfile.write('Fetching module X. Please wait')
self.wfile.flush() 

如何强制HttpServer 立即发送信息,而不是等待完整响应完成?

【问题讨论】:

    标签: python flush httpserver


    【解决方案1】:

    你可以使用python线程

    from threading import Thread
    t = threading.Thread(target=function to be call, args=[request])
    t.setDaemon(False)
    t.start()
    

    此代码将强制立即返回响应并在后台运行您的函数。

    【讨论】:

      【解决方案2】:

      建议您将user indication 改为header 而不是body。然后您可以使用stream 来达到您的要求。

      注意:接下来的代码是基于python2,如果你愿意,可以将http server related更改为python3 related api

      server.py:

      import BaseHTTPServer
      import time
      
      class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
          Page = "Main content here."
          def do_GET(self):
              self.send_response(200)
              self.send_header("Content-Type", "text/html")
              self.send_header("Content-Length", str(len(self.Page)))
              self.send_header("User-Information", "Fetching module X. Please wait")
              self.end_headers()
              time.sleep(10)
              self.wfile.write(self.Page)
      
      if __name__ == '__main__':
          serverAddress = ('', 8080)
          server = BaseHTTPServer.HTTPServer(serverAddress, RequestHandler)
          server.serve_forever()
      

      client.py:

      import requests
      
      r = requests.get('http://127.0.0.1:8080', stream=True)
      print(r.headers['User-Information'])
      print(r.content)
      

      解释:

      1. 如果使用streamheader information 仍然会被客户端一次获取,因此您可以使用print(r.headers['User-Information']) 一次将其打印给用户

      2. 但是使用streambody information 不会传输,它会延迟到客户端使用r.content 来要求它(Response.iter_lines() or Response.iter_content() 也可以),所以当你做print(r.content) 时,它将需要@987654339 @查看主要内容,因为它在服务器代码中花费了10s

      输出:(第一行将立即显示给用户,但第二行将在 10 秒后显示)

      正在获取模块 X。请稍候

      这里是主要内容。

      附上guide供您参考,希望对您有所帮助。

      【讨论】:

      • 谢谢。但是,就我而言,客户端来自浏览器。 :( 那样的话,我们怎样才能得到它?
      • 如果直接从html调用,恐怕不行。如果从 javascript 调用,可能是websocket?
      猜你喜欢
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 2019-11-30
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多