部署在DigitalOcean App Platform的Django静态资源缓存问题求助
问题背景
按照DigitalOcean的《How To Deploy a Django App on App Platform》指南完成部署,/admin页面可正常访问。但向App Platform推送生产环境变更后,CSS/JS文件无法更新:
- 已尝试强制刷新浏览器、更换浏览器、清除缓存,均无效
- 服务器staticfiles目录下文件已更新,但浏览器端未同步
为解决缓存问题,添加了ManifestStaticFilesStorage配置:
STORAGES = { 'staticfiles': { 'BACKEND': 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage', }, 'default': { 'BACKEND': 'django.core.files.storage.FileSystemStorage', }, }
部署后除测试页面外,其他页面均崩溃。尝试设置DEBUG=True部署,但static标签行为改变,无法复现错误。
当前Django配置:
# settings.py STATIC_URL = 'static/' STATIC_ROOT = BASE_DIR / 'staticfiles'
App Platform配置:静态资源组件路由为/static,输出目录为staticfiles。
调试建议
检查manifest文件完整性
部署后确认staticfiles目录下是否生成了staticfiles.json,这个文件是ManifestStaticFilesStorage生成的资源映射表。如果文件缺失或损坏,会导致资源路径解析失败,引发页面崩溃。可以通过App Platform控制台查看该文件内容,确认所有静态资源的哈希路径都正确映射。验证静态资源收集命令执行情况
确保部署过程中正确执行了python manage.py collectstatic --noinput命令。ManifestStaticFilesStorage需要在收集静态资源时生成哈希文件名和manifest文件,如果该命令未执行或执行失败,会导致资源路径不匹配。可以在App Platform的部署日志中搜索collectstatic相关输出,确认执行结果。检查模板中静态资源引用方式
所有静态资源必须通过Django的{% static %}模板标签引用,不能直接写死路径。如果某些页面使用了硬编码的/static/xxx路径,ManifestStaticFilesStorage会无法替换为带哈希的路径,导致资源404,页面崩溃。逐一排查非测试页面的模板代码,确认引用方式正确。临时开启生产环境调试日志
在settings.py中设置:LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'root': { 'handlers': ['console'], 'level': 'DEBUG', }, 'loggers': { 'django': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, }, }, }部署后查看App Platform的应用日志,重点关注静态资源加载相关的错误(如404、Manifest文件解析错误等),这些日志会直接指出崩溃原因。
测试单个非崩溃页面的资源路径
选择一个崩溃的页面,查看页面源代码,对比其中的静态资源路径和staticfiles目录下的实际文件名。如果路径中没有哈希值,说明模板未正确使用{% static %}标签;如果路径有哈希但服务器上不存在对应文件,说明collectstatic执行不完整。检查静态资源组件的路由配置
确认App Platform上静态资源组件的路由是否正确映射到/static,且输出目录确实指向staticfiles目录。如果路由配置错误,带哈希的资源路径会无法被静态资源组件处理,返回404。
内容的提问来源于stack exchange,提问作者paulchoix

