为啥我的静态文件在部署到 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 错误 (500) - 据说是静态文件问题
使用 Heroku 的 Django 部署中缺少静态文件清单条目