服务器错误(500)heroku 上的 Django 部署

Posted

技术标签:

【中文标题】服务器错误(500)heroku 上的 Django 部署【英文标题】:Server error (500) Django deployment on heroku 【发布时间】:2018-12-30 03:53:07 【问题描述】:

我在我的 settings.py 文件中将 debug 设置为 False(请注意,在我将其设置为 false 之前,一切正常),当我运行 git push heroku master 并访问我的网站时,主页正在运行,但那是我的所有页面都不是这样:在某些页面上,我收到错误消息 Server Error (500)

这是我的settings.py 代码:

DEBUG = False
ALLOWED_HOSTS = ["hacka-labs.herokuapp.com"]

我注意到我传递 id 的网址不起作用

如果你知道答案,请帮助我

【问题讨论】:

可能有些页面需要静态文件或者想从db读取数据,而你没有访问权限 我认为这不是问题,因为在我将 DEBUG 设置为 False 之前一切正常。 你在urls.py文件中定义了静态路由吗? 没有。我真的必须这样做吗? 【参考方案1】:

我遇到了类似的问题,很难弄清楚 DEBUG 何时设置为 False。当我将它重新配置回DEBUG = True 时,一切都恢复正常了。所以问题是

您通常不会在开发中看到此错误,因为当 DEBUG = True 时,ManifestStaticFilesStorage 切换到非散列 URL。 https://***.com/a/51060143/7986808

您的问题的解决方案可能与我的不同。但是你可以通过改变你的Django项目的日志记录方法来发现问题,这样即使在DEBUG = False模式下运行heroku logs -t -a <heroku-app>时,你也可以在命令行中看到更多信息。

settings.py 中更改您的 django 日志记录设置,如下所示:

LOGGING = 
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': 
        'verbose': 
            'format': ('%(asctime)s [%(process)d] [%(levelname)s] '
                       'pathname=%(pathname)s lineno=%(lineno)s '
                       'funcname=%(funcName)s %(message)s'),
            'datefmt': '%Y-%m-%d %H:%M:%S'
        ,
        'simple': 
            'format': '%(levelname)s %(message)s'
        
    ,
    'handlers': 
        'null': 
            'level': 'DEBUG',
            'class': 'logging.NullHandler',
        ,
        'console': 
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        
    ,
    'loggers': 
        'django': 
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': True,
        ,
        'django.request': 
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        ,
    

然后运行heroku logs -t -a <heroku-app> 并打开您之前收到500 错误的网址,您将在日志中发现问题。希望这会对你有所帮助。


如果缺少一些静态文件,只需在settings.py 中切换您的静态根目录,如下STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')。运行 heroku run python manage.py collectstatic -a <heroku-app> 会创建 staticfiles 目录。

【讨论】:

还需要加上django_heroku.settings(config=locals(), staticfiles=False,logging=False)logging =False【参考方案2】:

我有同样的错误。

我通过删除settings.py 中的import django heroku 解决了问题

【讨论】:

import django_heroku django_heroku.settings(locals())参考:pypi.org/project/django-heroku【参考方案3】:

我在 heroku 上部署 react 和 django 项目时遇到了同样的错误。 我已经调试了 2 天,做了所有的事情,比如允许的主机、静态文件、json、白噪声,但仍然没有解决问题。

如果您的浏览器抛出错误 500,则在 settings.py 中设置 DEBUG=True。如果它在 index.html 处引发 TemplateDoesNotExist 错误,那么更改 views.py 可能有助于解决该问题。部署前别忘了设置DEBUG=False

我通过更改views.py中的一些代码解决了这个问题。

def index(request):

return render(request,'ur_app_name.html')  

def index(request):

some_variable_name=TemplateResponse(request,'ur_app_name.html',)

return some_variable_name

别忘了在views.py上导入这个

from django.template.response import TemplateResponse

我不知道我到底遇到了什么问题,我猜这是一个 httpResponse 的事情,因为服务器需要 http 请求,而我们的本地机器不需要它。

这个错误的一些关键点:

    确保在 settings.py 文件中的 ALLOWED_HOST 中提及您的域名 设置STATIC_ROOT=os.path.join(BASE_DIR, 'staticfiles')in settings.py,当heroku抛出一个 collecticstatic 错误,但我不确定。如果它仍然抛出 同样的错误然后在命令上禁用collectstatic=1(你可以找到 调试日志中的确切命令)不会创建 任何问题。 在settings.py 中设置whitenoise.middleware.WhiteNoiseMiddleware,在MIDDLEWARE 中,这可能会有所帮助。 如果您的项目使用 react 和 django,则仅在 heroku 上添加构建包时选择 python。不要选择 node.js。

这是github repository 我上传我的heroku项目的地方,你可以在这里找到配置文件,这可能会有所帮助。

如果您的项目使用 react 和 django 及以上建议没有帮助,这可能会有所帮助:

检查.gitignore文件,安装所有requirement.txt文件 并将package.json文件复制到根目录。

设置"build": "cd <project folder name>&& react-scripts build",在package.json的脚本中

我的 index.html 和 manifest.json 在上面提到的 github repo 中。 “staticfiles”目录是使用“$python manage.py collectstatic”在根文件夹中创建的。如果您的项目没有,请尝试复制我的index.html 文件。 就是这样。

herokuapp 链接:https://sainterface.herokuapp.com/

【讨论】:

以上是关于服务器错误(500)heroku 上的 Django 部署的主要内容,如果未能解决你的问题,请参考以下文章

Gin Gonic 和 Qor Admin 的问题:heroku 上的错误 500

Heroku 在信息很少的情况下给出 500 错误 + 内部服务器错误

在 Heroku 服务器上部署 Django 错误 (500) - 据说是静态文件问题

Django Admin 在生产 Heroku 中引发 500 错误

每当 django 中的 debug=False 时,Heroku 都会给出服务器错误(500),而当 debug=True 时没有错误

使用 Django 在 Heroku 上接收带有图像的特定页面的服务器错误 500(由 WhiteNoise 提供静态服务)