即使使用 ALLOWED_HOSTS=["*"] 在 django 上使用 debug=False 命中 500 错误

Posted

技术标签:

【中文标题】即使使用 ALLOWED_HOSTS=["*"] 在 django 上使用 debug=False 命中 500 错误【英文标题】:Hitting 500 error on django with debug=False even with ALLOWED_HOSTS=["*"] 【发布时间】:2020-04-07 11:25:55 【问题描述】:

我尝试浏览的每个页面都出现 500 个错误。我唯一要更改的是 DEBUG 为 False。

这是我的配置:

SECRET_KEY = os.environ.get("SECRET_KEY", "0$ke!x1bz5cj0mpzo1zfx4omw-c9iqw%m95zb)(2@ddg5s+3!f")

ALLOWED_HOSTS = ['*']

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False


# Application definition

INSTALLED_APPS = [
    'posts', # Contains all dynamic and static pages related to posts
    'courses', # Contains all dynamic and static pages related to courses and modules
    'pages', # Contains all static pages that are not post related
    'markdownx', # Allows for editing and creating markdown content
    'jet.dashboard',
    'jet', # Django admin theme override
    'pwa', # Sets app to be PWA compliant
    'whitenoise.runserver_nostatic', # Serving static files
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

从字面上看,我看到的每个答案都说只需将您的 ALLOWED_HOSTS 设置为 ['*'],正如您所见,我已经做到了,但仍然没有骰子。我检查了文档,他们对 DEBUG 模式的其他影响非常少见,文档的一部分说:

作为一项安全措施,Django 不会包含可能敏感的设置,例如 SECRET_KEY。具体来说,它将排除名称中包含以下任何内容的任何设置: 'API' '钥匙' '经过' '秘密' '签名' “代币”

https://docs.djangoproject.com/en/2.2/ref/settings/#debug

我唯一能想到的是 secret_key 没有被拾取,但如果是这样,你如何在生产中做到这一点?

编辑:有些人一直要求我将调试模式设置为 true 以获取回溯。问题是,当我将其设置为 true 时,我没有收到 500 错误,只有当 DEBUG = False 时才出现。

【问题讨论】:

500 错误应该在控制台/日志中创建回溯。 请贴日志以便了解实际问题。 使用debug=True 并查看错误消息。如果不清楚,请在此处发布。 问题是当 debug 为 True 时我没有得到错误,而 Debug False 设置回溯实际上就是:python System check identified no issues (0 silenced). December 14, 2019 - 21:46:09 Django version 2.2.7, using settings 'canadiancoding.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK. [14/Dec/2019 21:46:14] "GET / HTTP/1.1" 500 27 @KieranWood 在 GitHub 上创建一个 repro 项目。 【参考方案1】:

因此,问题与未加载单个图标有关,路径已关闭,但由于 Django 处理静态文件的方式(这确实是愚蠢的),当 DEBUG=True 时我没有抓住它,当 DEBUG= False 没有没有回溯。

我学到的一个巧妙的技巧是,您可以强制 Django 通过在主 settings.py 中附加一个显式记录器来为您提供所需的日志记录信息,如下所示:

import logging
LOGGING = 
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': 
        'console': 
            'class': 'logging.StreamHandler',
        ,
    ,
    'loggers': 
        'django': 
            'handlers': ['console'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
        ,
    ,

因此,我在 6 个小时的调试中学到了三件事,你的处境就是这样:

    在您的开发周期中立即设置 DEBUG = False,它将强制您正确配置 collectstatic。 Heroku 获取应用程序设置的文档是关于如何正确配置 WhiteNoise,所以这里是真正的配置:
STATIC_URL = '/static/'

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

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

STATICFILES_STORAGE = '.storage.WhiteNoiseStaticFilesStorage' # Read point 3 for details about this
    您必须在本地子类化 WhiteNoises 默认配置以删除内置 manifest_strict 属性的 Django(从此处获取:https://***.com/a/51580328/11602400)
from whitenoise.storage import CompressedManifestStaticFilesStorage


class WhiteNoiseStaticFilesStorage(CompressedManifestStaticFilesStorage):
    manifest_strict = False

【讨论】:

【参考方案2】:

我解决了我的问题

    设置 DEBUG=True

    运行 $ python manage.py 收集静态

您的静态文件中的任何错误都会出现在您的终端中(如果有的话)。在继续之前尝试解决该错误。

    进入你的主项目/settings.py 而不是通过使用“*”来制作一般允许的主机。 将其替换为您的本地主机链接 例如:127.0。 0.1.

    进入浏览器的历史记录并删除最近的 cookie 和缓存。

    刷新您的项目,仅此而已。

【讨论】:

这对我帮助很大【参考方案3】:

添加一个答案,因为这只花了我几个小时来调试,这可能会让其他人免于同样的问题。

我只在某些管理页面上收到SERVER ERROR 500。有些模型可以正常工作,有些则不行。我当时怀疑是第三方模块。

这个问题出现在我身上,因为我使用的是django-nested-inline,并且通过pip 安装的版本中存在一个错误,无法找到修改管理页面以处理嵌套的 jQuery 所需的副本内联。

此错误已修复,因此我需要删除我正在使用的版本,然后直接从 Github 安装修复的版本。

【讨论】:

【参考方案4】:

添加一个答案,因为这让我难倒了一段时间和很多答案,虽然它们确实适用于收集您的静态文件,但如果您在 html 中有任何文件/图像/CSS/js 引用,也可能发生服务器错误 500实际上并不存在于您的项目目录中。例如,如果您引用 <link href="% static 'app/css/newStyle.css' %" rel="stylesheet" /> 并且该文件不存在,那么您将收到此错误。 检查哪些文件实际上不存在的最佳方法是在本地环境中运行 python manage.py runserver 并加载页面,以查看终端中的 404 错误,

它可能看起来像这样: "GET /static/app/css/newStyle.css HTTP/1.1" 404 1876 然后,如果不需要,您可以省略对该文件的引用或找到添加它的位置。

【讨论】:

以上是关于即使使用 ALLOWED_HOSTS=["*"] 在 django 上使用 debug=False 命中 500 错误的主要内容,如果未能解决你的问题,请参考以下文章

ALLOWED_HOSTS 在部署到 Elastic Beanstalk 的 Django 应用程序中不起作用

Django ALLOWED_HOSTS IP 范围

Heroku 需要 ALLOWED_HOSTS 吗?

用于 Amazon ELB 的 Django ALLOWED_HOSTS

Django REST api 调用和 allowed_hosts

将 Django 部署到 AWS Fargate 时,如何将本地 ip 添加到 ALLOWED_HOSTS