我正在使用Pyramid框架创建一个移动服务。由于是移动设备,减少带宽使用量非常重要。我正在考虑压缩所有的流量,甚至是动态HTML页面。
Pyramid框架为此提供了什么样的钩子?或者有没有WSGI中间件可以完成这个任务?我想在Python层面上完成这个任务,而不是使用Nginx / Apache,这样我可以更好地统计gzip带来的收益。
首先我应该强调,你应该在Web服务器级别(nginx或apache)上执行此操作。原因有以下几点:
性能 - 如果您在Python中执行此操作,则使用了一个本来可以处理请求的线程来执行CPU密集型压缩操作。这比允许经过优化的Web服务器处理要低效得多。
阻塞 - 大多数GZip中间件将阻止响应,缓冲正文以便可以压缩整个响应。如果您尝试向客户端流式传输任何响应,那么这是一个巨大的问题,因为它会被中间件卡住。实际上,这违反了PEP333,即WSGI规范。
基于以上所有内容,至少在开发期间进行调试时,在Python中执行此操作可能是有意义的。
既然您已经在使用Pyramid,那么您已经安装了Paste。因此,您只需将paste.gzipper.GzipMiddleware
添加到应用程序的管道中,如下所示:
[filter:gzip]
use = egg:Paste#gzip
compress_level = 6
[pipeline:main]
pipeline =
gzip
app
显然,如果你不想改变默认的压缩级别6,你可以简单地将egg:Paste#gzip
添加到管道中,代替配置过滤器并给它一个自定义名称(gzip
)。
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"
pip install paste
,顺便说一下。 - Michael Merickel