使用DEBUG = False将我的Django网站部署到Heroku无法正常工作

时间:2019-07-28 13:09:55

标签: python django heroku http-status-code-500

当使用DEBUG = False将django部署到localhost或heroku时,会抛出错误

C:\Users\krish\Envs\PRREMIA\lib\site-packages\whitenoise\base.py:105: UserWarning: No directory at: c:\Users\krish\Documents\python\PRREMIA\staticfiles\
  warnings.warn(u'No directory at: {}'.format(root))
[28/Jul/2019 16:05:43] "GET / HTTP/1.1" 500 27

当DEBUG = True时,它工作正常。

静态设置

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

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

Github

为什么?而我该如何停止并解决此问题?

注意:MIDDLEWARE删除whitenose中间件并更改STATICFILES_STORAGE

# STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'

消除了500错误,但仍然找不到静态文件。

2 个答案:

答案 0 :(得分:0)

您的STATICFILES_DIRS设置不正确:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

这是指项目根目录中的一个名为static的目录,但是没有这样的目录。

您的静态文件似乎位于business应用程序中,在这种情况下,它们将被自动提取,因此您可以完全删除STATICFILES_DIRS设置。

答案 1 :(得分:0)

配置Django / Create-React-App / Whitenoise以DEBUG = False运行git deploy到Heroku App

首先感谢Whitenoise开发人员,使这一切成为可能!

在您的settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'staticfiles')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },

    },
]

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'build/static'),     os.path.join(BASE_DIR, 'build')
]

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

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

在views.py中创建index.html的模板视图

from django.views.generic import TemplateView
from django.views.decorators.cache import never_cache

# Serve Single Page Application
index = never_cache(TemplateView.as_view(template_name='index.html'))

在urls.py中将路径添加到新视图

from django.urls import path, include, re_path
from .views import index

urlpatterns += [
    re_path('.*', index)
]

先运行npm run build,然后运行python manage.py collectstatic,然后再推送到heroku。这会将您的应用程序构建到构建文件夹中,然后将这些静态构建文件收集到项目根目录中的staticfiles文件夹中。

如果python manage.py collectstatic失败,请首先在项目根目录中创建一个名为staticfiles的空目录。

索引re_path视图的重点是,当在“ / login”之类的路径上重新加载页面时,始终将您的应用程序指向index.html。

git add .
git commit -m "blah"
git push heroku master

这对我有用,希望它对以后的人们有所帮助。

如果这不起作用,我的建议是通过在本地运行python manage.py runserver并弄乱您的build文件夹,staticfiles文件夹和settings.py来进行调查,以找出问题所在。我也建议登录以查找错误,尽管我自己没有这样做。