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: 1DISABLE_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 - 损坏的管理静态文件

Heroku Dyno 上的 Django 静态文件

Heroku 上的 Django 静态文件

如何从 Heroku 上的 Django 项目正确地提供我的 Angular 应用程序静态文件?

Django ValueError:缺少静态文件清单条目,但清单似乎显示了该条目

Heroku静态文件未加载,Django