python - 使用 python 在 Heroku 上启用压缩

标签 python heroku gzip deflate

谷歌现在由于对移动设备不友好而受到惩罚。因此,为了让事情变得更好,它建议我使用 Gzip 或 Deflate 压缩我的大量 Javascript。我看过一些关于堆栈溢出的旧建议,但没有开箱即用的东西,我尝试搜索附加组件,但到目前为止似乎还没有任何东西可以解决问题。压缩或启用 gzip 最不痛苦且最可靠的是什么?

Google 建议我这样做:

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

如果 Django 更容易的话,我正在使用 Django。

最佳答案

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

说明 - Google 建议的要点是尽量减少从服务器物理传输的字节数。有几种方法可以做到这一点,但在影响最大的方法中,排名不分先后 -

  • 精简 JavaScript 和 CSS
  • 将这些文件合并在一起
  • 操纵缓存行为
  • 压缩 HTTP 响应体

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

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

然而,在 Heroku 中,HTTP 层在平台本身和您的应用程序之间分离 - “路由网格”充当反向代理,处理基本的 HTTP 和 HTTPS 并通过注入(inject)带有代理信息的 header 来增强请求,例如;其他一切都取决于您的应用程序。但是,您的“应用程序”受到相当大的限制,因为您没有自由安装 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” header ,这将为您提供 gzip 压缩的内容。还有很多很多其他的杠杆和旋钮可以拉动和调整,但这是一个起点。最终,您会担心 CPU 开销并希望预压缩文件;或者您可能决定卸载静态文件是可行的方法。

为了验证,使用像 cURL 这样的工具来抓取一个静态文件:

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

-i 标志应该打印出 header ,它将向您显示有关如何处理请求的详细信息。注意`内容编码

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

希望这有助于...

关于python - 使用 python 在 Heroku 上启用压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30290766/

相关文章:

javascript - 可扩展的Node.js应用程序体系结构

c# - 通过网络将压缩数据从 C# 发送到 Java

python - 将多个不同数据类型的 Numpy 数组写入 CSV 文件的列

python - 使用 Percona 安装 mysql-python

python - 将 Django 应用程序部署到 Heroku 会导致错误worker failed to boot

ruby-on-rails - rails 4.2升级后性能超慢

python - 如何在 Aerospike(缓存)中存储 Gzip 压缩内容?

http - 如何使用 gzip 设置内容编码

python - 不能让基于请求构建的脚本从网页生成所有图像链接

python - 根据单个单元格的条件从 numpy 数组中删除列