Whitenoise 应该自动压缩静态文件吗?如何?

Should Whitenoise auto-compress static files? How?

我最近为将 运行 在 Heroku 上运行的 Django 项目启用了 Whitenoise。我希望 Whitenoise 自动压缩我的静态文件,这在文档的这一部分似乎是可能的: http://whitenoise.evans.io/en/stable/django.html#add-compression-and-caching-support

但是,在我的设置中添加以下内容后:

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

我发现我的文件没有压缩!

curl -H "Accept-Encoding: gzip" -I http://localhost:8080/static/app/js/auth.min.js

HTTP/1.0 200 OK
Date: Thu, 30 Nov 2017 17:14:27 GMT
Server: WSGIServer/0.2 CPython/3.5.2
Last-Modified: Thu, 30 Nov 2017 01:45:33 GMT
Content-Length: 103648
Content-Type: application/javascript; charset="utf-8"
Cache-Control: max-age=0, public
Access-Control-Allow-Origin: *

但是,如果我手动 gzip 我的一个文件,一切都很好

$ gzip ../app/static/app/js/auth.min.js
$ curl -H "Accept-Encoding: gzip" -I http://localhost:8080/static/app/js/auth.min.js
HTTP/1.0 200 OK
Date: Thu, 30 Nov 2017 17:21:47 GMT
Server: WSGIServer/0.2 CPython/3.5.2
Last-Modified: Thu, 30 Nov 2017 17:14:53 GMT
Content-Type: application/javascript; charset="utf-8"
Cache-Control: max-age=0, public
Access-Control-Allow-Origin: *
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 21870

我是否只需要在我的构建过程中添加一些脚本来 gzip 所有内容,或者 Whitenoise 是否包括这个?如果是这样,有没有人知道我可能遗漏了什么或做错了什么?我真的很希望能够(如上面的文档中所宣传的那样)永远缓存所有内容

collectstatic管理命令为运行时,压缩自动完成。作为构建过程的一部分,该命令由 Heroku 运行 获取,因此您无需执行任何其他操作即可获得压缩支持。

如果您想在本地测试它,您需要自己 运行 collectstatic 然后 运行 您的应用 DEBUG = False 以获得与您相同的行为会在生产中。

在我的例子中,这是由我的 Django 设置引起的
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
因为 collectstatic 过程因 .css 文件中引用的不存在的字体文件而失败。

这个错误停止了整个过程,因此没有生成压缩文件。

解决方案
切换到 STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'

注意:不存在的文件导致错误的问题实际上是 Django 的 ManifestStaticFilesStorage,而不是 WhiteNoise。