即使ALLOWED_HOSTS=["*"],在Django中使用debug=False仍然会出现500错误

7
我在访问每个页面时都遇到了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' 'KEY' 'PASS' 'SECRET' 'SIGNATURE' 'TOKEN'

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

我能想到的唯一问题是 secret_key 没有被识别,但如果是这样,那么在生产环境中该怎么做呢?
编辑:有些人要求我将调试模式设置为 true 以获取回溯信息。问题是,当我将其设置为 true 时,我不会收到 500 错误,只有在 DEBUG = False 时才会出现。

一个500错误应该在控制台/日志中创建一个回溯。 - Klaus D.
请发布日志以便了解实际问题。 - Vibhu
使用debug=True并查看错误信息。如果不清楚,请在此处发布。 - Gábor Erdős
1
问题在于当调试为True时,我不会得到错误,而且当Debug False设置时,回溯实际上只是:系统检查未发现任何问题(0被静音)。 2019年12月14日 - 21:46:09 Django版本2.2.7,使用设置'canadiancoding.settings'在http://127.0.0.1:8000/上启动开发服务器/ 使用CTRL-BREAK退出服务器。 [14 / Dec / 2019 21:46:14]“GET / HTTP / 1.1”500 27 - Kieran Wood
@KieranWood 在 GitHub 上创建一个可复现的项目。 - aaron
当您执行os.environ['SECRET_KEY']时,输出是什么? - Debendra
4个回答

14

所以,问题与单个图标未加载有关,路径偏离了,但由于 Django 处理静态文件的方式(说实话很傻),当 DEBUG=True 时我没有发现它,而当 DEBUG=False 时没有回溯信息。

我学到的一个不错的技巧是,在主要的 settings.py 中显式地附加一个记录器,这样可以强制 Django 提供您需要的日志信息,如下:

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小时的调试中,我学到了三件事情,如果你处于我的情况下:

  1. 在开发周期中立即设置DEBUG = False,这将迫使您正确配置collectstatic。
  2. 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
  1. 你需要在本地子类化WhiteNoise的默认配置,以删除Django内置的manifest_strict属性(可以从这里找到: https://dev59.com/g-k5XIcBkEYKwwoY_Ox3#51580328
from whitenoise.storage import CompressedManifestStaticFilesStorage


class WhiteNoiseStaticFilesStorage(CompressedManifestStaticFilesStorage):
    manifest_strict = False

2
我通过以下步骤解决了我的问题:
  1. project/settings.py 中设置 DEBUG=True

  2. 运行程序

$ python manage.py collectstatic

任何静态文件中的错误都会在终端中显示,如果有错误,请尝试在继续之前解决它。
3. 进入您的主要项目/设置.py文件,并用本地主机链接替换使用“*”的一般允许主机。例如:127.0.0.1
4. 进入浏览器历史记录并删除最近的cookie和缓存。
5. 刷新您的项目,这就是全部内容。

这帮助了我很多。 - farhan jatt

0

添加一个答案,因为这个问题困扰了我一段时间,而且很多答案虽然适用于收集静态文件,但如果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然后,如果不需要,您可以省略对此文件的引用,或者找到要添加的位置。


0

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

某些管理页面仅出现服务器错误500。 有些模型能正常工作,而有些则不行。 这时我怀疑是第三方模块引起的问题。

这个问题出现在我使用django-nested-inline时,通过pip安装的版本中存在一个错误,该错误无法找到修改管理页面以处理嵌套行内的必要jQuery文件。

这个错误已经修复,所以我需要删除我使用的版本,然后直接从Github安装修复版。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接