You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Heroku上为Django Compressor的CSS/JS文件开启Gzip压缩

解决Heroku上Django-compressor离线压缩文件的Gzip问题

方案:用WhiteNoise自动处理Gzip(无需S3)

WhiteNoise是轻量的Django静态文件托管库,能自动为静态文件生成Gzip版本,且在请求时根据客户端头自动返回压缩文件,适配Heroku环境,配置成本极低。

步骤1:安装WhiteNoise

在项目的requirements.txt中添加依赖:

whitenoise>=6.0

推送代码到Heroku后,平台会自动完成安装;本地测试可执行pip install -r requirements.txt。

步骤2:修改Django配置(settings.py)

  • 将WhiteNoise中间件插入到中间件列表的指定位置(必须在SecurityMiddleware之后):
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',  # 新增此行
    'django.contrib.sessions.middleware.SessionMiddleware',
    # 其他原有中间件...
]
  • 开启Gzip支持,在配置文件末尾添加:
# WhiteNoise配置
WHITENOISE_USE_FINDERS = True
WHITENOISE_GZIP = True
WHITENOISE_COMPRESS_ON_FLY = False  # 配合compressor离线压缩,使用预生成文件
WHITENOISE_AUTOREFRESH = DEBUG  # 开发环境自动刷新静态文件,生产环境关闭

步骤3:配置离线压缩的部署钩子

将compressor的离线压缩命令加到Heroku的release阶段,确保每次部署时自动生成压缩文件:
修改项目根目录的Procfile:

release: python manage.py compress --force
web: gunicorn 你的项目名.wsgi

步骤4:验证生效

部署完成后,打开浏览器开发者工具的「网络」面板:

  • 查看压缩后的CSS/JS文件的响应头,确认存在Content-Encoding: gzip和Vary: Accept-Encoding
  • 对比文件大小,确认已实现Gzip压缩

替代方案:手动生成Gzip文件(无需额外依赖)

如果不想引入WhiteNoise,可通过脚本手动生成Gzip文件,再配置Django返回对应头:

  • 修改Procfile的release命令,在压缩后生成Gzip文件:
release: python manage.py compress --force && find static -name "*.css" -o -name "*.js" | xargs gzip -k -9
  • 自定义简单中间件,检测请求的Accept-Encoding头,若包含gzip则返回对应的.gz文件并设置响应头(此方法需编写少量代码,复杂度略高于WhiteNoise方案)

内容的提问来源于stack exchange,提问作者Michael Ettlinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:05:15