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