繁体   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