【问题标题】:Python : Generating a gzip string by returning chunksPython:通过返回块生成 gzip 字符串
【发布时间】:2011-04-26 22:26:01
【问题描述】:

我要问一些我在 Stackoverflow 上找不到的东西。 我正在做一些 Django,我最近发现我可以使用生成器流式传输 HTTP 输出。 页面的输出非常适合正常情况,但我想使用 GZip 压缩流式传输页面输出。

我尝试使用简单的 zlib.compress 函数,但无济于事。该函数生成小的 gzip 文件。

我想在处理数据时以字符串形式返回小块数据。这些块应该形成 Gzipped 文件的内容。如何做到这一点? 谢谢。

【问题讨论】:

    标签: python django


    【解决方案1】:

    使用zlib.compressobj([level])Compress.compress(string)Compress.flush([mode]) 完成

    import zlib
    def compress(chunks):
        c = zlib.compressobj()
        for chunk in chunks:
           yield c.compress(chunk)
        yield c.flush(zlib.Z_FINISH)
    

    【讨论】:

    • 像往常一样在 Stackoverflow 上非常快速的答案。非常感谢你。代码看起来不错但不起作用,浏览器返回生成页面的错误。
    • 是否设置了适当的放气标题?
    • 嗯,其实我也不知道。我已将“内容编码”设置为“gzip”:response['Content-Encoding'] = "gzip"。未设置此标头会按预期返回乱码。
    • 问题在于这不会产生 gzip 而是产生 deflate 编码,因此您需要设置 response['Content-Encoding'] = "deflate"
    • 完美,丹。不幸的是,浏览器等待输出完成。 [..一分钟过去了..] yield c.flush(zlib.Z_SYNC_FLUSH) 当您想将输出刷新到浏览器时可以解决问题。非常感谢。
    【解决方案2】:

    压缩内容是您的网络服务器的属性,而不是框架。如果你使用的是 apache,你可以使用mod_deflate。我希望您不是指 django 为测试目的提供的简单服务器。如果您指的是这样做,那么只需查看术语 gzip 的代码,看看它是否进行了任何类型的压缩。

    另外,如果您正在考虑压缩 app server,请注意,最好将此作业移至 Web 服务器。

    【讨论】:

    • 非常感谢您的快速回复。我实际上使用 nginx 作为 django 代码的代理。在这种配置中,我不确定要求 nginx 对输出进行 gzip 处理:我没有测试过(我的错),但如果它等待输出完成,那将是有意义的,这不是我想要的。跨度>
    猜你喜欢
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2021-06-11
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多