cdn加速生效的关键是静态文件名带哈希、路径可缓存、回源路径匹配;需配置compressedmanifeststaticfilesstorage、debug=false、static_url与cdn回源路径严格一致,并确保s3存储类实现url()方法。

直接把 STATIC_URL 指向 CDN 域名不等于就完成了 CDN 加速——真正起作用的,是静态文件名带哈希、路径可缓存、回源路径对得上这三件事。其他操作都是围绕它们打转。
collectstatic 生成的文件名没哈希?检查 STATICFILES_STORAGE
WhiteNoise 或 CDN 加速失效最常见的原因:运行了 python manage.py collectstatic --clear,但 STATIC_ROOT 下的文件还是 app.js 而不是 app.a1b2c3d4.js。
- 必须设置
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'(Django 4.2+ 推荐用ManifestStaticFilesStorage,但 WhiteNoise 的这个类会额外压缩) - 别漏掉
CompressedManifest—— 普通ManifestStaticFilesStorage不压缩,也不生成staticfiles.json,CDN 缓存更新会出问题 - 确保
DEBUG = False,否则CompressedManifestStaticFilesStorage在开发模式下不会生效
CDN 返回 404?先确认 STATIC_URL 和回源路径是否咬合
比如你用阿里云 CDN,控制台里「回源 Host」填的是 myapp.com,「回源路径」默认是 /,那你的源站实际提供静态文件的路径就是 https://myapp.com/static/css/app.css。此时 STATIC_URL 必须设成 'https://cdn.example.com/static/',而不是 'https://cdn.example.com/'。
- 模板中
{% static 'css/app.css' %}渲染出的 URL,要和 CDN 实际去源站拉取的路径完全一致 - 如果 CDN 控制台开启了「自动去除请求前缀」或「重写回源路径」,要对应调整
STATIC_URL;反之若没开,就老老实实把子路径带上 - 用
curl -I https://cdn.example.com/static/css/app.css看响应头:Content-Type应该是text/css,不是text/html——后者说明 CDN 回源失败,返回了 Django 的 404 页面
想用 S3 / OSS 当源存储?别硬改 STATIC_URL,走 STORAGES
Django 4.2+ 弃用了 DEFAULT_FILE_STORAGE 和旧式 STATICFILES_STORAGE 配置,统一用 STORAGES 字典管理所有存储后端。
- 自定义 S3 存储类(如
myproject.storage.S3StaticStorage)写好后,在settings.py中配置:
STORAGES = {
"staticfiles": {
"BACKEND": "myproject.storage.S3StaticStorage"
}
}
- 这样
collectstatic会直接上传到 S3,无需本地STATIC_ROOT目录中转 -
STATIC_URL仍需设为 CDN 域名(如'https://cdn.example.com/'),但前提是 CDN 的源站已配置为该 S3 Bucket 的访问域名,且权限放通 - 注意:S3 存储类必须实现
url()方法,返回可公开访问的 URL,否则{% static %}模板标签会生成错误链接
最容易被忽略的一点:CDN 加速效果依赖浏览器和中间节点对 URL 的长期缓存,而 URL 是否能被长期缓存,取决于文件名是否含内容哈希。所以哪怕你用了最贵的 CDN,只要 collectstatic 没生成哈希文件,所有缓存策略都白搭。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











