Heroku静态文件未加载,Django
Posted
技术标签:
【中文标题】Heroku静态文件未加载,Django【英文标题】:Heroku static files not loading, Django 【发布时间】:2015-05-11 17:46:51 【问题描述】:我正在尝试将 my Django project 推送到 Heroku,但它没有加载静态文件。
我使用this 进行设置,一切正常,但我无法解决静态文件的问题。
我的目录结构是这样的
help_the_needy
help_the_needy
__init__.py
settings.py
urls.py
views.py
wsgi.py
manage.py
Procfile
requirements.txt
static
css
font-awesome
fonts
img
js
templates
base.html
display_list2.html
index.html
Here 是完整的代码(所有文件)。
This 是我的 settings.py。
我尝试了很多方法来解决这个问题,但似乎没有任何效果。
当我推送它does copy static files 但它没有加载它们。
有人可以指出我的错误吗?哪里错了?
【问题讨论】:
您是否尝试在 Heroku Django shell 上运行命令 python manage.py collectstatic --dry-run --noinput?你有什么错误吗? 是的。我没有错误。 (gyazo.com/30ea49aeb727054f5dd21265a45ae261)。 你可以试试:STATIC_ROOT = 'staticfiles', STATIC_URL = '/static/', STATICFILES_DIRS = (os.path.join(BASE_DIR,'../static'),) TEMPLATE_DIRS = (os .path.join(BASE_DIR, '../templates'),) @LhAcKg 它不工作,同样的输出。 @TapasweniPathak 您的根项目设置添加此代码 import os and BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(file)) ) 【参考方案1】:我也一直在处理同样的问题。这是我在代码中更改的两件事。
(我使用的是 Django 1.7)
1) 设置.py
我将这些行添加到设置文件中
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'templates'),
# Add to this list all the locations containing your static files
)
STATIC_ROOT:这告诉 Django (a) 在您运行 python manage.py collectstatic
时将静态文件放在哪里,以及 (b) 在您运行应用程序时找到静态文件
TEMPLATE_DIRS:这告诉 Django 在您运行 python manage.py collectstatic
时搜索静态文件时在哪里寻找您的静态文件
2) wsgi.py
原来我的文件是:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxxx.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
我把它改成了:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxxx.settings")
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = get_wsgi_application()
application = DjangoWhiteNoise(application)
阅读此处了解有关白噪声的更多信息:https://devcenter.heroku.com/articles/django-assets#whitenoise
另外,记得安装 whitenoise:
pip install whitenoise==2.0.6
在部署项目之前,运行:
python manage.py collectstatic
这将创建一个由 STATIC_ROOT 指示的文件夹(在您的 settings.py 中声明),其中包含您的所有静态文件。
【讨论】:
自从发布这个答案已经有几年了,这就是在 Django 3.2 中对我有用的方法。【参考方案2】:自从这篇文章发布已经有几年了(当我搜索问题时它仍然会弹出),这就是在 Django 3.2 中对我有用的方法。
pip install whitenoise
确保在 settings.py 中有
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
# Extra places for collectstatic to find static files.
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
向中间件添加白噪声:
MIDDLEWARE = [
'whitenoise.middleware.WhiteNoiseMiddleware',
]
确保您指定为 STATIC_ROOT(静态文件)的目录存在于您的基本目录中且不为空。
之后,我提交了更改,Heroku 能够构建静态文件,一切正常。
【讨论】:
【参考方案3】:您的 STATICFILES_DIRS 设置错误。它应该指向包含文件的“静态”目录的实际位置:
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
【讨论】:
我以前也这样做过,但没有用。我也试过 os.path.join(BASE_DIR, '../static') ,它也没有用。我再次尝试了这两种方法,输出相同。 还有什么办法解决这个问题?【参考方案4】:pip install whitenoise
将白噪声添加到requirement.txt。
还在settings.py的中间件中添加白噪声
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', #add whitenoise
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
按照https://devcenter.heroku.com/articles/django-assets中的步骤操作
【讨论】:
【参考方案5】:看起来 django 不知道你的 static_root 在哪里。
此文件夹在您触发 manage.py collectstatic
时自动生成
确保文件夹 static
和 templates
在您的 django 应用程序中。你没有创建一个 django 应用程序来放置这个文件夹。你创建了一个 django 项目,下一步是创建一个 django 应用程序,类似于 python manage.py startapp polls
# Absolute filesystem path to the Django project directory:
DJANGO_ROOT = dirname(dirname(abspath(__file__)))
# Absolute filesystem path to the top-level project folder:
SITE_ROOT = dirname(DJANGO_ROOT)
STATIC_URL = '/static/'
STATIC_ROOT = normpath(join(SITE_ROOT, 'static_root'))
【讨论】:
【参考方案6】:您的urls.py
文件缺少管理和路由静态资源请求的设置。
为了提供对静态资源的访问,您必须添加到 urlpatterns
of urls.py
:
urlpatterns += patterns('',
(r'^static/(?P<path>.*)$', 'django.views.static.serve', 'document_root': settings.STATIC_ROOT),
)
【讨论】:
那只是为了开发。 @DanielRoseman 我知道,但 Heroku 需要此配置,可以在此处找到另一个答案。 ***.com/questions/9047054/… 不,链接的答案是完全错误的。正确答案由Heroku's own documentation 提供,并且 OP 已经大部分时间都在关注它。以上是关于Heroku静态文件未加载,Django的主要内容,如果未能解决你的问题,请参考以下文章