为啥我的静态文件在部署到 Heroku 服务器时没有提供? (姜戈)

Posted

技术标签:

【中文标题】为啥我的静态文件在部署到 Heroku 服务器时没有提供? (姜戈)【英文标题】:Why are my static files not served when deployed to Heroku server? (Django)为什么我的静态文件在部署到 Heroku 服务器时没有提供? (姜戈) 【发布时间】:2022-01-07 20:36:39 【问题描述】:

所以这是 Django 用户的一个常见错误,即Debug=False 时没有在生产中提供静态文件。我已经尝试了很多方法来克服这个问题,但仍然无法找到正确的解决方案。下面是我的settings.py

...
DEBUG = False

MIDDLEWARE = [
    'whitenoise.middleware.WhiteNoiseMiddleware',
    ...
]
...

STATIC_URL = '/static/'
STATICFILES_DIRS = [ 
    os.path.join(BASE_DIR, 'static'), 
    os.path.join(BASE_DIR, 'main/static'),
    os.path.join(BASE_DIR, 'member/static'),
    os.path.join(BASE_DIR, 'register/static'),
]

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

STATICFILES_FINDERS = [
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

我不明白我做错了什么。 *可能是潜在原因的一件事是,自从最初部署到 heroku 服务器以来,我已经设置了 DISABLE_COLLECTSTATIC=1

remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Building on the Heroku-20 stack
remote: -----> Using buildpack: heroku/python
remote: -----> Python app detected
remote: -----> Using Python version specified in runtime.txt
remote: -----> No change in requirements detected, installing from cache
remote: -----> Using cached install of python-3.7.12
remote: -----> Installing pip 21.3.1, setuptools 57.5.0 and wheel 0.37.0
remote: -----> Installing SQLite3
remote: -----> Installing requirements with pip
remote: -----> Skipping Django collectstatic since the env var DISABLE_COLLECTSTATIC is set.
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 102.1M
remote: -----> Launching...
remote:        Released v153

【问题讨论】:

collect static了吗? @Jonas 每次更改静态文件时我都必须collect static 吗?我做过一次,从那时起就没有添加任何静态文件。 (不过对现有的进行了一些更改。) 是的,如果您添加/删除/更改静态文件,您必须重新收集它们 @Jonas 我明白了。所以我必须python manage.py collectstatic然后部署到heroku服务器,对吧? 【参考方案1】:

试试这个:

    添加到您的setting.py 安装的应用程序'whitenoise.runserver_nostatic'。 添加到您的设置.py MIDDLEWARE 'whitenoise.middleware.WhiteNoiseMiddleware' 将这 3 行添加到您的 seeting.py 中
STATIC_URL = '/static/'
STATICFILES_DIRS = (str(BASE_DIR.joinpath('static')),)
STATIC_ROOT = str(BASE_DIR.joinpath('staticfiles'))
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' # new
django_heroku.settings(locals())

这里最后一行需要安装django_heroku(不是django_on_heroku,要小心)

欲了解更多信息,请查看:https://learndjango.com/tutorials/django-static-files。

附:如果在此之后由于找不到 staticfiles 文件夹而失败,请手动创建它。你只需要做一次就可以了。一个空文件夹,仅此而已。

【讨论】:

以上是关于为啥我的静态文件在部署到 Heroku 服务器时没有提供? (姜戈)的主要内容,如果未能解决你的问题,请参考以下文章

找不到静态文件 - 在 Heroku 上部署 Django

在 Heroku 服务器上部署 Django 错误 (500) - 据说是静态文件问题

使用 Heroku 的 Django 部署中缺少静态文件清单条目

为啥 tsc 不在 Heroku 中运行?

为啥 datatables.net 在我的 Rails 开发环境中可以工作,但在部署到 Heroku 时却不行?

为啥在将应用程序部署到 Heroku 时出现此错误?