使用Pyramid Gzipping所有HTTP流量

时间:2011-07-08 01:24:50

标签: python http gzip pyramid

我正在创建一个基于Pyramid框架的移动服务。因为它是移动的,所以减少带宽使用的一切都是加分。我正在考虑对所有流量进行压缩,甚至是动态HTML页面。

Pyramid框架为此提供了什么样的钩子?或者是否有WSGI中间件用于任务?我想在Python级别上做这个,而不是Nginx / Apache,所以我可以更好地统计gzip带来多少好处。

3 个答案:

答案 0 :(得分:24)

首先,我要强调你应该在Web服务器级别(nginx或apache)上执行此操作。这有几个原因:

  1. 性能 - 如果你在Python中执行此操作,则使用一个可以处理请求进行cpu密集压缩的线程。这比允许优化的Web服务器处理它的效率低。

  2. 阻止 - 大多数GZip中间件会阻止你的响应,缓冲身体,以便它可以压缩整个响应。如果您尝试将任何响应流回客户端,这是一个巨大的问题,因为它会被中间件捕获。这实际上违反了WSGI规范PEP333。

  3. 考虑到所有这些,在Python中进行此操作可能是有意义的,至少在开发期间是为了调试目的。

    由于您已经在使用Pyramid,因此您已安装了粘贴。因此,您可以简单地将paste.gzipper.GzipMiddleware添加到应用程序的管道中,如下所示:

    [filter:gzip]
    use = egg:Paste#gzip
    compress_level = 6
    
    [pipeline:main]
    pipeline =
        gzip
        app
    

    显然,如果您不想将压缩级别从默认值6更改,您只需将egg:Paste#gzip添加到管道中,而不是配置过滤器并为其指定自定义名称({{1} })。

答案 1 :(得分:5)

您仍然可以使用Apache获得每请求压缩统计信息。我像这样创建了一个deflate.log:

DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '%a %v %{outstream}n/%{instream}n (%{ratio}n%%) "%r"' deflate
CustomLog /var/log/httpd/deflate.log deflate

现在我得到的日志条目如下:

ip domain -/- (-%) "GET /wp-content/uploads/2010/03/favicon.ico HTTP/1.1"
ip domain 10995/52406 (20%) "GET /2006/07/19/ HTTP/1.0"
ip domain 1873/7891 (23%) "POST /registration/regForm HTTP/1.1"

我可以分析我心中的内容。

答案 2 :(得分:1)

以下是WSGI级别的几个选项: