对于基于BaseHTTPServer的简单服务器,我有以下代码。
class myHandler(BaseHTTPRequestHandler):
#Handler for the GET requests
def do_GET(self):
# Parse the query_str
query_str = self.path.strip().lower()
if query_str.startswith("/download?"):
query_str = query_str[10:]
opts = urlparse.parse_qs(query_str)
# Send the html message and download file
self.protocol_version = 'HTTP/1.1'
self.send_response(200)
self.send_header("Content-type", 'text/html')
self.send_header("Content-length", 1)
self.end_headers()
self.wfile.write("0")
# Some code to do some processing
# ...
# -----------
self.wfile.write("1")
我希望HTML页面显示“1”,但它显示“0”。如何通过保持活动来更新响应?
答案 0 :(得分:3)
我相信您将 self.protocol_version 设置为' HTTP / 1.1'太晚了。您正在do_GET()方法中执行此操作,此时您的请求处理程序已经实例化,并且服务器已经检查了该实例的protocol_version属性。
最好在课堂上设置它:
class myHandler(BaseHTTPRequestHandler):
protocol_version = 'HTTP/1.1'
答案 1 :(得分:1)
不确定您要完成的任务,但如果您希望发送1,则需要将内容长度设置为2或完全删除它。 1不会覆盖0,所以你会看到01。
答案 2 :(得分:1)
https://docs.python.org/2/library/basehttpserver.html
<强> PROTOCOL_VERSION 强>
指定响应中使用的HTTP协议版本。如果设置为&#39; HTTP / 1.1&#39;,服务器将允许HTTP持久连接;但是,您的服务器必须在其对客户端的所有响应中包含准确的Content-Length标头(使用send_header())。为了向后兼容,设置默认为&#39; HTTP / 1.0&#39;。
答案 3 :(得分:0)
我遇到了同样的问题。我尝试在 do_METHOD() 函数中设置 protocol_version 但不起作用。 我的代码看起来像这样。
def _handle(self, method):
self.protocol_version = "HTTP/1.1"
# some code here
def do_GET(self):
self._handle("GET")
我使用 ss 和 tcpdump 来检测网络,最终发现服务器会在发送响应后重置连接,尽管它使用的是 http/1.1。
所以我尝试在从标准库类继承的类下设置 protocol_version 并且它有效。由于时间成本,我不会深入研究源代码。希望它对其他人有用。