即使使用 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 应用程序中不起作用
用于 Amazon ELB 的 Django ALLOWED_HOSTS