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

Posted

技术标签:

【中文标题】Whitenoise 应该自动压缩静态文件吗?如何?【英文标题】:Should Whitenoise auto-compress static files? How? 【发布时间】:2018-05-14 17:21:41 【问题描述】:

我最近为将在 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 是否包含这个?如果是这样,有没有人知道我可能遗漏了什么或做错了什么?我真的很希望能够永久保存所有内容(如上面的文档中所宣传的那样)

【问题讨论】:

您似乎在开发中看到了这种行为,而不是在生产中。你见过whitenoise.evans.io/en/stable/…吗? 嘿 Alasdair,很抱歉没有说,是的!我看到了,并按照建议在我的 INSTALLED_APPS 中添加了“whitenoise.runserver_nostatic”,因为 --nostatic 标志本身对我不起作用:manage.py runserver: error: unrecognized arguments: --nostatic 【参考方案1】:

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

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

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

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

【讨论】:

您可以手动添加来自maennergesundheitsbericht.de/fileadmin/styles/mgb/css/…的文件并自动解决错误【参考方案2】:

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

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

【讨论】:

您好,感谢您的回复!就像和名人聊天一样!在运行python manage.py collectstaticpython manage.py runserver localhost:8080 之后,我的响应中仍然没有得到 gzip 编码,即使我设置了 DEBUG = False,并且安装了 whitenoise.runserver_nostatic 应用程序。如果我在运行服务器之前手动运行gzip 命令,我只会得到 gzip 编码。我测试了部署到 Heroku,静态文件也没有在那里压缩,除非我手动执行。 哦,不过,我认为你指出了我正确的方向!运行collectstatic 后,我在不同的目录中找到了文件的压缩版本。我必须错误地配置了静态文件。我可以从这里调试。谢谢!!

以上是关于Whitenoise 应该自动压缩静态文件吗?如何?的主要内容,如果未能解决你的问题,请参考以下文章

如何调试带有whitenoise,gunicorn和heroku的Django静态文件?

Django:Whitenoise 在调试错误的情况下无法在生产中工作

如何在 Django 中为 WhiteNoise 5.1.0 设置 wsgi.py 文件?

仅使用 gunicorn、django 和 whitenoise 我如何提供媒体服务?

gzip 在带有 Whitenoise 的 Django 中不起作用

使用 Django 在 Heroku 上接收带有图像的特定页面的服务器错误 500(由 WhiteNoise 提供静态服务)