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

Posted

技术标签:

【中文标题】gzip 在带有 Whitenoise 的 Django 中不起作用【英文标题】:gzip not working in Django with Whitenoise 【发布时间】:2015-10-26 20:01:05 【问题描述】:

我在 Heroku 上部署了一个 Django 网站,使用 Whitenoise 提供静态文件。

静态文件工作正常,但根据我用来测试它的各种网站(包括谷歌工具),Gzip 无法正常工作。

这是我的生产设置文件中的代码:

DATABASES['default'] = dj_database_url.config()


SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

ALLOWED_HOSTS = ['*']

STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'

我的静态文件配置:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

STATIC_URL = '/static/'
STATIC_ROOT = 'staticfiles'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

我的 wsgi.py 文件

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sikumim.settings")

application = get_wsgi_application()

#HEROKU DEPLOYMENT

from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)

可能是什么原因?

我运行了 cmets 中建议的一些命令,看起来 gzip 不起作用:

➜ ~ curl -I -H "Accept-Encoding: gzip" http://127.0.0.1:8000/

HTTP/1.0 200 OK
Date: Mon, 17 Aug 2015 13:56:02 GMT
Server: WSGIServer/0.2 CPython/3.4.0
X-Frame-Options: SAMEORIGIN
Vary: Cookie
Content-Type: text/html; charset=utf-8
Set-Cookie:  csrftoken=SsgKEp76HDhG5L7otWxqBJeMyb00Vp03; expires=Mon,      15-Aug-2016 13:56:02 GMT; Max-Age=31449600; Path=/

➜ ~ curl -I -H "Accept-Encoding: gzip" http://www.sikumia.co.il

HTTP/1.1 200 OK
Connection: keep-alive
Server: gunicorn/19.3.0
Date: Mon, 17 Aug 2015 13:57:37 GMT
Transfer-Encoding: chunked
X-Frame-Options: SAMEORIGIN
Vary: Cookie
Content-Type: text/html; charset=utf-8
Set-Cookie: csrftoken=23M5ODiFKRnU3fDYMe3j2Rn3dwtCsNMX; expires=Mon, 15-Aug-2016 13:57:37 GMT; Max-Age=31449600; Path=/
Via: 1.1 vegur

【问题讨论】:

谷歌页面洞察工具说 gzip 没有激活,所有其他工具都在说同样的事情 两个问题 - 1) 您是否使用 curl 在本地进行检查(例如,curl -i -H "Accept-Encoding: gzip" http://localhost:8000/path/to/static 和 2)您如何在 Procfile 中运行应用程序?我让 gzip 与 gunicorn 一起工作,但不是与 runserver 一起工作(这不应该是您的生产配置)。 对不起,我是个新手,我在 heroku 上运行应用程序。我的 procfile 中只有一行: web: gunicorn sikumim.wsgi 我会试试 curl 命令 @davegri - 尝试使用您的实际静态文件之一,例如 sikumia.co.il/static/css/base.92c9631393b3.css。它正在被压缩。 '/' 上的默认页面不是,大概是因为它是由 Django 生成的模板。请注意,Whitenoise 将 gzip 静态内容,但不会压缩动态内容(我知道这有点令人困惑)。要压缩动态内容,您需要添加 Django 中间件 (docs.djangoproject.com/en/1.8/ref/middleware/…)。希望这会有所帮助! 确保您阅读了文档中的评论并链接了有关 BREACH 压缩侧信道攻击的 PDF (breachattack.com/resources/…)。 【参考方案1】:

WhiteNoise 仅为您的静态文件启用 gzip,而不是为您的整个站点启用 gzip,因此您需要检查其中一个静态文件,例如

curl -I -H "Accept-Encoding: gzip" http://www.sikumia.co.il/static/some-file.css

【讨论】:

【参考方案2】:

应该有问题

https://docs.djangoproject.com/en/1.8/ref/middleware/#gzip-middleware

如果满足以下任一条件,它将不会压缩内容:

内容正文的长度小于 200 字节。回应已经 设置 Content-Encoding 标头。请求(浏览器)尚未发送 包含 gzip 的 Accept-Encoding 标头。您可以应用 GZip 使用 gzip_page() 装饰器压缩到单个视图。

【讨论】:

以上是关于gzip 在带有 Whitenoise 的 Django 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

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

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

django/whitenoise 存储后端导致错误

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

使用 WhiteNoise 在生产模式下将 django 部署到 Elastic Beanstalk

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