Heroku 上的 Django - 缺少静态文件 manifest.json 文件
Posted
技术标签:
【中文标题】Heroku 上的 Django - 缺少静态文件 manifest.json 文件【英文标题】:Django on Heroku - missing staticfiles manifest.json file 【发布时间】:2021-02-21 10:29:57 【问题描述】:我正在尝试在 Heroku 上启动 Django。我环顾 Stack Overflow,尝试了不同的方法,但我无法弄清楚。它看起来类似于 Django 上与 staticfiles 问题相关的所有问题,不幸的是我不知道问题出在哪里。我的项目使用DEBUG = True
运行良好,但是当我将其更改为 False 时,我得到以下回溯:
2020-11-09T13:13:42.801384+00:00 app[web.1]: Missing staticfiles manifest entry for 'order/css/open-iconic-bootstrap.min.css'
它发生在我所有需要静态文件的应用程序上。我试图找到 manifest.json,但它不存在。所以我认为这是问题所在。
这是我的相关设置:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
#more ...
]
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
django_heroku.settings(locals())
感谢您对此进行调查!
【问题讨论】:
你能确认你已经尝试过heroku run python manage.py collectstatic
吗?您的设置是否启用了 DISABLE_COLLECTSTATIC ?如果是,禁用它可能会让您了解发生了什么问题。也可以设置 DEBUG_COLLECTSTATIC=1。
@keoma 这是我的配置:DEBUG_COLLECTSTATIC: 1
DISABLE_COLLECTSTATIC: 0
。我尝试切换 DISABLE_COLLECTSTATIC,但我看不出有任何区别。当我在 heroku 上运行 collectstatic 时,我在我的所有文件上都得到了 It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path
,导致 0 static files copied to /app/staticfiles, 742 unmodified, 2140 post-processed
DISABLE_COLLECTSTATIC=0
和未设置的变量之间可能存在差异。你可以试试heroku config:unset DISABLE_COLLECTSTATIC
吗?确保运行构建脚本,而不仅仅是重新启动脚本。
@keoma 成功了!您可以将其发布为答案吗?
【参考方案1】:
cmets 中的@keome 已经为您提供了调试此问题的第一步,所以我不会在这里重复。
尽管他们提出了问题(应该首先查看),但我认为关键问题是您的白噪声配置未设置为生成清单。你可能想要:
# Serve compressed and manifested static files
STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"
您当前的配置可以使用 DEBUG=1
的原因是,在调试模式下,django 将回退到自己提供静态文件(既不安全也不高效)。
其次,确保您运行 collectstatic
时使用与运行服务器相同的存储配置 - 我看不到您拥有哪些设置文件,但您似乎收集了静态而没有显示策略,但是您正试图为它提供 一个清单策略(因此 django 对为什么没有清单感到困惑)。
顺便说一句,默认情况下,whitenoise 创建一个staticfiles.json
文件,而不是manifest.json
文件,它被用作静态文件。因此,如果您的STATIC_URL = "/static/"
,那么您可以在<your-domain>/static/staticfiles.json
找到清单。
编辑 - 澄清
静态文件的清单实际上没有被称为 manifest.json
的原因是因为这与作为渐进式 Web 应用程序 (spec here) 一部分的 manifest.json
的常用名称冲突,这有点像类似(因为它可以作为浏览器在哪里找到某些文件的指令)但不一样。
【讨论】:
我有上面的 STATICFILES_STORAGE 行,但我得到了所有相同的症状。我可以通过设置 DEBUG=False 并执行 collectstatic 来在本地重现。我可以看到静态文件中的所有文件,但 Django 没有提供它们(400 个错误)。关于如何调试的想法? 我没有正确安装白噪声。 (我忘了添加中间件。)以上是关于Heroku 上的 Django - 缺少静态文件 manifest.json 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Heroku 上的 Django 项目正确地提供我的 Angular 应用程序静态文件?