簡體   English   中英

立即獲取Python HttpServer響應

[英]Getting Python HttpServer response instantly

我在服務器端使用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線程

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

此代碼將強制立即返回響應並在后台運行您的函數。

建議您將user indication放在header而非body 然后,您可以使用stream來滿足您的要求。

注意:下一個代碼基於python2 ,您可以根據需要更改http server related python3 related api http server related

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. 如果使用stream ,則header information仍將由客戶端立即獲取,因此您可以使用print(r.headers['User-Information'])一次將其print(r.headers['User-Information'])給用戶。

  2. 但是使用streambody information將不會傳輸,它會延遲到客戶端使用r.content要求它時( Response.iter_lines() or Response.iter_content()也可以),因此當您執行print(r.content) ,它需要10 seconds看到的主要內容,因為它花費10s的服務器代碼。

輸出:(第一行將立即顯示給用戶,但第二行將在10秒后顯示給用戶)

正在獲取模塊X。請稍候

主要內容在這里。

附上指南以供參考,希望對您有所幫助。

暫無
暫無

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

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