应使用 manifeststaticfilesstorage 替代 staticfilesstorage,它通过文件内容哈希生成带指纹的静态文件名(如 main.a1b2c3d4.js),配合 {% static %} 标签和 collectstatic 生成的 staticfiles.json 实现精准缓存更新,但需注意生产环境启用、避免硬编码路径、确保构建流程正确及 cdn/nginx 缓存策略适配。

staticfiles\_storage 用 ManifestStaticFilesStorage 而不是 StaticFilesStorage
默认的 StaticFilesStorage 不改文件名,浏览器靠 Cache-Control 或时间戳判断是否更新,容易缓存旧资源。换成 ManifestStaticFilesStorage 后,Django 构建时自动给每个静态文件加哈希后缀(比如 main.a1b2c3d4.js),HTML 中引用的也是带哈希的路径,文件内容一变,路径就变,浏览器自然加载新版本。
需要在 settings.py 显式配置:
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
注意:它依赖 collectstatic 生成 staticfiles.json 清单文件,所以部署前必须跑一遍 python manage.py collectstatic;本地开发时如果没开 DEBUG=False,这个存储类不会生效——它只在生产模式下才重命名文件。
模板里必须用 {% static %} 而不是硬编码路径
哈希文件名只在通过 Django 的静态文件系统解析时才生效。如果你在模板里写 <script src="/static/js/app.js"></script>,Django 根本不介入,也就不会替换成 app.7f8a9b2c.js。
正确做法是统一走模板标签:
<script src="%7B%%20static%20'js/app.js'%20%%7D"></script>
这样 Django 才会查 staticfiles.json,把原始路径映射成带哈希的最终路径。常见错误包括:
- 在 JS 里拼接
/static/xxx.css字符串(比如动态加载样式) - 用
<link rel="stylesheet" href="%7B%7B%20STATIC_URL%20%7D%7Dcss/base.css">这种手动拼接 - 第三方库配置里填死路径(如 Webpack 输出 public 目录后直接扔进 static,绕过 Django 管理)
collectstatic 失败或哈希不变?检查文件内容和 STATICFILES_DIRS
哈希值只跟文件内容有关,不是修改时间。如果改了 CSS 但哈希没变,大概率是:
- 你改的是开发环境下的源文件(如
src/css/main.scss),但collectstatic打包的是编译后的dist/main.css,而你忘了重新构建 -
STATICFILES_DIRS指向了错误目录,Django 拿到了旧版本的文件 - Git 忽略了
staticfiles.json,上线时清单丢失,ManifestStaticFilesStorage回退到无哈希行为(但不报错,极难察觉)
验证方式:运行 python manage.py collectstatic --dry-run -v 2,看它实际读取的是哪个路径下的文件;再检查输出目录里是否有 staticfiles.json,以及里面是否包含你期望的哈希键。
CDN 或 Nginx 缓存要同步清理或跳过哈希文件
即使 Django 生成了带哈希的路径,如果 CDN 把 /static/js/app.a1b2c3d4.js 缓存了 1 年,下次发布还是可能返回旧内容——因为路径没变,CDN 认为它是同一个资源。
解决思路分两层:
- CDN 配置上,对
/static/下所有带哈希后缀的文件(如\.([a-f0-9]{8,})\.)设置短缓存(比如max-age=31536000但加immutable,或直接no-cache) - Nginx 如果做了静态文件代理,别用
expires 1y一刀切,应匹配哈希路径单独处理,或干脆让 Django 的whitenoise/staticfiles视图接管,由它发正确的ETag和Last-Modified
最容易被忽略的是:哈希本身解决了“该不该更新”的问题,但没解决“更新后能不能立刻拿到”的问题——中间链路每一环都得认这个新路径。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











