使用python在Heroku上启用压缩

时间:2015-05-17 18:48:16

标签: python heroku gzip deflate

谷歌现在因为不那么适合移动设备而受到惩罚。因此,为了使事情变得更好,它建议我使用Gzip或Deflate压缩我的大量Javascript。我已经看到了关于堆栈溢出的一些旧建议,但没有任何开箱即用的东西,我尝试搜索附加组件,但到目前为止,似乎没有什么可以做到这一点。压缩或启用gzip最不痛苦和最强大的是什么?

Google建议我这样做:

启用压缩 使用gzip或deflate压缩资源可以减少通过网络发送的字节数。 为以下资源启用压缩,将传输大小减少420KiB(减少74%)。

我使用Django,如果这更容易。

1 个答案:

答案 0 :(得分:10)

底部排队前线 - 这将取决于您的应用程序的详细信息...... Flask? Django的? uWSGI? whitenoisegunicorn似乎是Heroku上的“go to”框架,所以这就是我在下面的示例中使用的内容。它应该转换为其他框架。

解释 - Google建议的要点是尽量减少从服务器物理传输的字节数。有几种方法可以做到这一点,但影响最大,没有特别的顺序 -

  • 缩小JavaScript和CSS
  • 合并这些文件
  • 操纵缓存行为
  • 压缩HTTP响应正文

引用的建议涉及最后一点,重要的是要理解压缩响应主体是HTTP规范中“内容协商”的一部分 - 浏览器不仅仅通过URL请求特定资源;它还提供了关于该资源的首选表示的提示,例如,什么内容类型,它如何编码,是否可以在多个“块”中发送等。

因此,理想情况下,处理HTTP的应用程序层应该处理此特定任务。在典型的应用程序堆栈中,这意味着像Apache或nginx这样的Web服务器,其中Web服务器将代理对Web框架的特定动态路径的请求,并直接处理“静态”内容。

然而,在Heroku中,HTTP层在平台本身和应用程序之间分配 - “路由网格”充当反向代理,处理基本HTTP和HTTPS并通过向代码信息注入头来增强请求,例如;其他一切都取决于你的应用程序。但是,你的“app”相当受限制,因为你没有自由统治来安装nginx等。

大多数Web框架(Django,Flask,Rails,Play!等等)都是高度通用的,可以与外部Web服务器(推荐用于生产)一起工作,也可以独立工作,提供自己的,通常轻量级Web服务器(推荐用于开发)。框架还与“容器”很好地配对,“容器”既为应用程序提供运行时环境,又为HTTP层提供繁重的工作(uWSGI,Gunicorn,Rack等)

这是Heroku的选择。虽然我对uWSGI有最丰富的经验,但下面的例子是Flask + Gunicorn + WhiteNoise(用于在Python上用Heroku提供静态文件的首选库)。请注意,WhiteNoise也适用于Django,因此如果Django成为您的首选框架,那么适应这一点应该是微不足道的。所以,所有这些阐述都会导致两个非常简单的步骤:

  • whitenoise添加到您的requirements.txt
  • 修改WSGI应用程序,让WhiteNoise“包装”您的应用程序。

例如:

from flask import Flask
from whitenoise import WhiteNoise

flapp = Flask(__name__)
#use a subdirectory for root, otherwise, the actual .py files can be served...
app = WhiteNoise(flap, root='./static/')

#define your routes:
@flapp.route('/')
def home_page():
    #etc. etc.

如果客户端发送“Accept-Encoding:gzip”标头,这将为您提供gzip内容。有许多其他杠杆和旋钮可以拉动和调整,但这是一个起点。最终,您会担心CPU开销并希望预压缩文件;或者您可以决定卸载静态文件是可行的方法。

要验证,请使用cURL之类的工具来获取静态文件:

curl -i -H "Accept-Encoding: gzip" http://yourapp.herokuapp.com/path/to/static

-i标记应打印出标题,这将显示请求的提供方式的详细信息。注意`Content-Encoding

HTTP/1.1 200 OK
Connection: keep-alive
Server: gunicorn/19.3.0
Date: Wed, 20 May 2015 15:33:35 GMT
Last-Modified: Wed, 20 May 2015 15:26:06 GMT
Content-Type: text/html; charset="utf-8"
Cache-Control: public, max-age=60
Access-Control-Allow-Origin: *
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 662
Via: 1.1 vegur

希望这会有所帮助......

相关问题