Python - BaseHTTPServer保持活着不起作用

时间:2014-11-22 18:30:36

标签: python basehttpserver

对于基于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”。如何通过保持活动来更新响应?

4 个答案:

答案 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 并且它有效。由于时间成本,我不会深入研究源代码。希望它对其他人有用。