【问题标题】:Deploying my Django website to Heroku with DEBUG=False doesn't work使用 DEBUG=False 将我的 Django 网站部署到 Heroku 不起作用
【发布时间】:2019-07-28 13:09:55
【问题描述】:

当使用 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 错误,但仍然找不到静态文件。

【问题讨论】:

  • Whitenoise 处理静态文件。所以显示你的静态设置。
  • Heroku 永远不应该显示任何带有C:\ 的内容。这是 Windows 风格的路径,Heroku 不运行 Windows。您是否在设置中的任何位置都包含绝对路径?
  • @Chris 不,我一直在使用正斜杠。 (老实说,直到几个月前我才知道 Windows 使用了反斜杠)。你也可以看看我的code
  • 您应该检查您是否可以在本地运行python manage.py collectstatic 而不会出现任何错误。如果 Heroku 在编译项目时无法成功运行,那么静态文件将无法正常工作。
  • @12944qwerty,它不仅仅是反斜杠。它是C: 本身,以及对似乎指向本地虚拟环境的Windows 路径的引用:C:\Users\krish\Envs\PRREMIA。您的代码中的某些内容正在引用本地路径。

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


【解决方案1】:

配置 Django / Create-React-App / Whitenoise 以在 DEBUG = False 的情况下运行 git deploy 到 Heroku 应用程序

非常感谢 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的空目录。

index re_path 视图的要点是,在像“/login”这样的路径重新加载页面时,始终将您的应用程序指向 index.html。

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

这对我有用,希望它在未来对人们有所帮助。

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

【讨论】:

    【解决方案2】:

    您的 STATICFILES_DIRS 设置不正确:

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

    这里指的是你项目根目录下一个名为static的目录,但是没有这个目录。

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

    【讨论】:

    • 您刚刚将您的问题改写为不同的问题。这不是一个好主意,因为现在没有任何 cmets 或答案对于将来查看此问题的人来说是有意义的。
    • 好的,但是我刚刚尝试了您的建议,不幸的是,它没有用.. :(
    猜你喜欢
    • 2020-10-30
    • 1970-01-01
    • 2021-01-28
    • 2017-01-12
    • 2021-04-30
    • 2019-12-05
    • 2016-12-24
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多