【问题标题】:How to use Content-Encoding: gzip with Python SimpleHTTPServer如何使用 Content-Encoding:gzip 和 Python SimpleHTTPServer
【发布时间】:2012-03-26 06:01:38
【问题描述】:

我正在使用python -m SimpleHTTPServer 在网络浏览器中提供用于本地测试的目录。一些内容包括大型数据文件。我希望能够对它们进行 gzip 压缩,并让 SimpleHTTPServer 使用 Content-Encoding: gzip 为它们提供服务。

有没有简单的方法可以做到这一点?

【问题讨论】:

    标签: python gzip simplehttpserver


    【解决方案1】:

    从SimpleHTTPServer的documentation看,没有办法。不过,我推荐lighttpd with the mod_compress module

    【讨论】:

      【解决方案2】:

      这是一个老问题,但对我来说它仍然在 Google 中排名第一,所以我想一个正确的答案可能对我身边的人有用。

      解决方案非常简单。在do_GET()、do_POST等中,只需添加以下内容:

      content = self.gzipencode(strcontent)
      ...your other headers, etc...
      self.send_header("Content-length", str(len(str(content))))
      self.send_header("Content-Encoding", "gzip")
      self.end_headers()
      self.wfile.write(content)
      self.wfile.flush()
      

      strcontent 是您的实际内容(如 HTML、javascript 或其他 HTML 资源) 和 gzipencode:

      def gzipencode(self, content):
          import StringIO
          import gzip
          out = StringIO.StringIO()
          f = gzip.GzipFile(fileobj=out, mode='w', compresslevel=5)
          f.write(content)
          f.close()
          return out.getvalue()
      

      【讨论】:

      • 当然,上面是该代码的直接复制粘贴。但是话又说回来,上面的 sn-ps 说明了一切,完整的功能代码也充当了 JSON 桥梁,这有点模糊了这个问题的目的。无论如何,如果您需要更多信息或代码,请给我发邮件。
      【解决方案3】:

      由于这是谷歌搜索结果中排名靠前的结果,我想我会将我的简单修改发布到让 gzip 工作的脚本。

      https://github.com/ksmith97/GzipSimpleHTTPServer

      【讨论】:

        【解决方案4】:

        在上面的@velis 答案的基础上,这就是我的做法。 gZipping 小数据不值得花时间,而且会增加其大小。用 Dalvik 客户端测试。

        def do_GET(self):
            ... get content
            self.send_response(returnCode)       # 200, 401, etc
            ...your other headers, etc...
            if len(content) > 100:                       # don't bother compressing small data
                if 'accept-encoding' in self.headers:    # case insensitive
                    if 'gzip' in self.headers['accept-encoding']:
                        content = gzipencode(content)    # gzipencode defined above in @velis answer
                        self.send_header('content-encoding', 'gzip')
            self.send_header('content-length', len(content))
            self.end_headers()          # send a blank line
            self.wfile.write(content)
        

        【讨论】:

          【解决方案5】:

          和其他许多人一样,我也一直在使用python -m SimpleHTTPServer 进行本地测试。这仍然是 google 上的最高结果,虽然 https://github.com/ksmith97/GzipSimpleHTTPServer 是一个不错的解决方案,但即使没有请求,它也会强制执行 gzip,并且没有启用/禁用它的标志。

          我决定编写一个支持此功能的小型 cli 工具。好了,所以常规的安装过程很简单:

          go get github.com/rhardih/serve

          如果您已经将$GOPATH 添加到$PATH,这就是您所需要的。现在你有 serve 作为命令。

          https://github.com/rhardih/serve

          【讨论】:

            【解决方案6】:

            这是一个功能请求,但由于想要保持简单的 http 服务器简单而被拒绝:https://bugs.python.org/issue30576

            问题作者最终发布了 Python 3 的独立版本:https://github.com/PierreQuentel/httpcompressionserver

            【讨论】:

            • 只是提醒他人。 httpcompressionserver 没有像“http.server”那样自动绑定地址。对我来说它崩溃了。我必须从以下开始:python3 -m httpcompressionserver --bind 0.0.0.0 请参阅:github.com/PierreQuentel/httpcompressionserver/issues/2
            • 这应该已经在 pypi 上修复了。如果没有,请联系作者。
            猜你喜欢
            • 1970-01-01
            • 2016-12-28
            • 1970-01-01
            • 2013-06-29
            • 2012-08-27
            • 2013-02-23
            • 2018-11-29
            • 2012-05-10
            相关资源
            最近更新 更多