2014-11-22 110 views
1

我有一个简单的基于BaseHTTPServer的服务器的以下代码。Python - 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”。我如何通过保持活力来更新响应?

回答

1

不知道你要完成什么,但是如果你想要发送1,你需要将你的内容长度设置为2或完全删除它。 1.不会覆盖0,所以你会看到01

+0

doog的回应看起来我的权利......你也许能够self.wfile.seek(-1),以改变它..小心的性格编码和字符串长度,如果你这样做的话。 – 2014-11-22 22:22:24

+0

嗨。感谢你的回答。我希望页面在处理完成后立即显示1。最初,我希望它显示0.如果我设置内容长度2,它只能在处理完成后才显示01。 – 2014-11-23 18:14:05

+0

我不知道有什么方法可以使用HTTP来做到这一点。有可能你可以用重定向来实现你的目标,但是它需要更复杂的代码。我几乎可以保证你试图解决的实际问题已经用另一种技术解决了,但我不认为有一种方法可以在单个HTTP响应中覆盖数据。 – 2014-11-23 18:46:53

1

https://docs.python.org/2/library/basehttpserver.html

PROTOCOL_VERSION

这指定响应中使用的HTTP协议版本。如果设置为“HTTP/1.1”,服务器将允许HTTP持久连接;但是,您的服务器必须在其所有对客户端的响应中包含一个准确的Content-Length头(使用send_header())。为了向后兼容,该设置默认为'HTTP/1.0'。

3

我相信你在设置self.protocol_version到'HTTP/1.1'太晚了。您正在使用do_GET()方法执行此操作,此时您的请求处理程序已经实例化,并且服务器已经检查了该实例的protocol_version属性。

更好的设置它的类:

class myHandler(BaseHTTPRequestHandler): 
    protocol_version = 'HTTP/1.1' 
+0

将其提升为可见度。这是我确切的问题,试图在GET()方法中设置协议版本不起作用。 – monkeymatrix 2017-05-08 21:35:10