使用 python 在 Heroku 上启用压缩

2024-01-02

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

这是谷歌建议我做的事情:

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

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


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

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

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

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

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

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

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

这是 Heroku 的选择。尽管我对 uWSGI 拥有最多的经验,但下面的示例是 Flask + Gunicorn + WhiteNoise(在 Python 中的 Heroku 上提供静态文件的首选库)。请注意,WhiteNoise 也适用于 Django,因此如果 Django 是您选择的框架,那么对其进行调整应该很简单。因此,所有这些说明都只需两个非常简单的步骤即可开始:

  • Add 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

The -iflag 应该打印出标头,这将向您显示如何处理请求的详细信息。注意“内容编码”

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

希望这可以帮助...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 python 在 Heroku 上启用压缩 的相关文章

随机推荐

  • NestJs 中所有装饰器的 Eslint 错误“已定义但从未使用”警告

    我正在为一个项目使用 NestJs 框架 今天发现EsLint发现了587个错误的问题 所有装饰器都会生成此错误 warning IsBoolean is defined but never used typescript eslint n
  • 带通滤波器组

    我已经实现了一组定向带通滤波器本文中描述的 https www researchgate net publication 220539167 Multidirectional Scratch Detection and Restoratio
  • 是否可以自动获取 Intellij 的正则表达式帮助来获取自己的正则表达式参数

    Intellij 为需要正则表达式的参数提供正则表达式 帮助 语法检查 例如编码 String array string split 将在正则表达式下标记错误并提供工具提示错误 不封闭组 这也适用于变量 例如 String myVar sh
  • 使用 Pusher API 通知特定用户

    我有一个使用jquery mobile和phonegap的移动网络应用程序 另一个是php网站 我希望只向在线和移动应用程序上的特定用户发送通知 接收在php网站端和移动网络应用程序上在线的用户的通知所以我的问题是如何为特定用户设置频道 因
  • WPF BitmapFrame 和多线程

    我有一个 PNG 文件存储在我的云中的 blob 存储中 我想下载它并在 WPF 中将其渲染在屏幕上 我知道调度程序和冻结 但没有任何作用 我不断收到有关 另一个线程拥有它 的错误 这是我所拥有的 var decoder GetDecode
  • 如何为Python安装scipy?

    我有Python 2 7 而且我有迪斯图尔斯 http docs python org library distutils html安装 我下载了最新版本的Scipy 赢得 32 http sourceforge net projects
  • Ansible fileglob:无法在预期路径中找到...

    我正在尝试使用 ansible 删除目录中的所有文件 同时保留目录 为此 我正在使用with fileglob按任务键将所有文件从该目录中取出item变量 我创建了一个最小的示例来显示我的问题 流浪文件 Vagrant configure
  • 开发客户端-服务器 iPhone 应用程序

    如果我想开发一个采用客户端 服务器设计的 iPhone 应用程序 iPhone 设备作为客户端和 C 服务器 有两个问题 是否可以使用我自己的笔记本电脑来运行服务器 如果不是 我有什么选择 我是否必须开发自己的消息传输协议 因此 如果我理解
  • 使用动态/具体类型初始化类型变量

    我正在学习 Scala 我试图创建一个类型类来解决 每种动物都吃食物 但食物的类型取决于动物 的问题 我有一个Eats具有上下文边界的类型类 trait Eats A lt Animal B lt Edible object Eats de
  • UWP:如何调用WinAPI方法

    我的问题很简单 我如何调用 WinAPI 方法 例如空剪贴板 https msdn microsoft com de de library windows desktop ms649037 v vs 85 aspx在 UWP 应用中 我包含
  • 如何限制图例大小并使其可与饼图一起滚动?和 javafx 布局

    我在我的 Swing 面板上集成了 javafx 饼图 它工作正常 但我的数据列表太大 无法放入图例中 并且图例正在扩展 导致饼图变小 我想让它可滚动但找不到任何解决方案 我是 javafx 新手 另外 您建议饼图面板和场景采用什么布局来适
  • 向 SQLAlchemy 查询添加上下文注释

    我正在尝试找出一种方法来向 SQLAlchemy 生成的查询添加注释 以指示其起源点 我知道 prefix with 方法 但对它不满意 因为它只会将前缀放在 SELECT 之后 并且我希望我的注释与实际查询逻辑完全分开 我偶然发现了一个解
  • PHP:使用“new”初始化数组与不使用“new”初始化数组有什么区别?

    我总是通过填充数组来创建数组 foo car 但我见过很多 foo array foo car and foo new array 不初始化 使用 array 和使用 new array 之间有什么区别 thanks 您不可以使用以下方法在
  • EF 上具有默认过滤器的实体

    我的 edmx 文件中有一个名为 Client 的实体 我必须对其运行多个 linq 查询 但在所有查询上 我需要一个过滤器 假设 active 1 我不想有一个where c active 1对于我的所有查询 我的实体应用了默认过滤器更有
  • WPF - 从组标题样式中绑定到当前项目

    我是 WPF 菜鸟 所以请对我放轻松 我正在尝试创建一个分组的 DataGrid WPF 工具包版本 我已成功创建数据源 DataGrid 本身 所需的 CollectionViewSource 和组标题的样式 使用扩展器 我想按名为 As
  • 原因是什么,Swift 应该比 Objective-C 快得多? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 正如 Craig 在 Swift 公告中透露的那样 据说它迄今为止比 Objective C 更快 但我不太相信这种比较 因为正确实现的算法在
  • 如何在Rails UJS中设置超时?

    新的 很酷的语法允许我写 link to some path remote gt true 生成 AJAX 请求 但是如果我需要更长的超时时间 例如100000ms 我可以在哪里设置它 我读link to http api rubyonra
  • React:来自不同子组件的子组件中的触发方法

    我在 React 中创建了两个组件
  • 如何使用 AVAssetReader 和 AVAssetWriter 控制视频帧速率?

    我们正在尝试了解如何控制 指定我们正在编码的视频的帧速率AVAssetReader and AVAssetWriter 具体来说 我们正在使用AVAssetReader and AVAssetWriter对我们从照片 视频库访问的视频进行转
  • 使用 python 在 Heroku 上启用压缩

    谷歌现在因为对移动设备不太友好而受到惩罚 因此 为了让事情变得更好 它建议我使用 Gzip 或 Deflate 压缩大量 Javascript 我看过一些关于堆栈溢出的旧建议 但没有任何现成的东西 我尝试搜索附加组件 但到目前为止似乎还没有