如何在Heroku Cedar上启用gzip压缩(Python/Flask/Gunicorn)

15

如何在新的Heroku Cedar堆栈上启用GZIP压缩?以下是直接从他们的网站摘录:

由于对Cedar应用程序的请求直接发送到应用程序服务器,而不是通过像nginx这样的HTTP服务器代理,因此必须在您的应用程序内部完成响应的任何压缩。对于Rack应用程序,可以使用Rack::Deflater中间件来实现。对于经过gzip压缩的静态资产,请确保在您的中间件堆栈中在ActionDispatch::Static之前加载Rack::Deflater。

如果我理解正确,我的Python应用程序代码现在负责压缩响应?我该如何压缩我的静态资产(例如css/js)?我正在使用Flask和GUnicorn。


1
也许感觉不对,但他们肯定是在告诉你。在python.org上,您可以找到有关gzip使用的文档:http://docs.python.org/library/gzip.html - gforcada
这里只是在玩弄恶魔的角色 - 为什么需要使用gzip?您不需要支付Heroku中出入带宽的费用,那么为什么需要压缩呢? - John Beynon
8
我需要进行压缩,因为我的用户更喜欢加载一个只有300KB重量而不是1MB的页面! - Gabriel Florit
2个回答

9

我没有使用Pyramid,就像上面所说的那样。而且那个Flask链接也不是完整的实现。 - Gabriel Florit
1
Pyramid和Flask都是基于WSGI的。你需要WSGI中间件,而不是特定于Flask的中间件。 - Tavis Rudd
1
这里有另外两个链接:http://code.google.com/p/ibkon-wsgi-gzip-middleware/source/browse/trunk/gzip_middleware.py 和 http://www.evanfosmark.com/2008/12/python-wsgi-middleware-for-automatic-gzipping/。再次强调,这是WSGI中间件,不是Flask、Gunicorn或Pyramid。 - Tavis Rudd
太好了,你的回答指引了我正确的方向!我还找到了这个:http://pylonsbook.com/en/1.1/the-web-server-gateway-interface-wsgi.html#altering-the-response。现在可以工作了,谢谢! - Gabriel Florit

2
根据2003年发布的WSGI规范,应用程序不应该压缩响应,而是交给服务器(假定为Apache,以CGI风格运行应用程序)处理。

应用程序和中间件不能对其输出应用任何传输编码,例如分块或gzip;作为“逐跳”操作,这些编码属于实际的Web服务器/网关领域。

但是,今天在2013年,通常应用程序就是服务器。 WSGI没有预料到这一点。根据http://www.b-list.org/weblog/2009/aug/10/wsgi/,这是一个问题。

WSGI有趣的坚持与CGI兼容,这意味着,在2009年,Python Web开发世界仍然无法显着改进1997年的应用程序编程模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接