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 时自动生成 确保文件夹 statictemplates 在您的 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的主要内容,如果未能解决你的问题,请参考以下文章

在 Heroku 上找不到 Django 静态文件(带白噪声)

静态文件未加载 [DJANGO]

Django全局静态文件未加载

Django 静态文件未加载且没有错误迹象

Heroku Dyno 上的 Django 静态文件

从 django 静态文件提供服务并上传到 heroku 时无法找到反应静态文件