设置DEBUG = False会导致500错误

zhi*_*ang 292 django settings django-1.5

有一次,我改变DEBUG = False,我的网站将产生500(使用WSGI和manage.py runserver命令),并且在Apache的错误日志中没有错误信息,当我改变它通常会运行debugTrue.

我正在使用Django 1.5和Python 2.7.3这里是Apache访问日志,没有任何登录apache错误日志

www.beta800.net:80 222.247.56.11 - - [28/Feb/2013:13:42:28 +0800] "GET / HTTP/1.1" 500 257 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22"
www.beta800.net:80 222.247.56.11 - - [28/Feb/2013:13:42:28 +0800] "GET /favicon.ico HTTP/1.1" 500 257 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22"
www.beta800.net:80 222.247.56.11 - - [28/Feb/2013:13:42:28 +0800] "GET /favicon.ico HTTP/1.1" 500 257 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22"
Run Code Online (Sandbox Code Playgroud)

这是我的设置文件:

import os.path    
DEBUG = False 
#TEMPLATE_DEBUG = DEBUG

HERE = os.path.dirname(__file__)
ADMINS = (
    ('admin', 'xyzadmin@qq.com'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'zdm',                      # Or path to database file if using sqlite3.
        'USER': 'root',                      # Not used with sqlite3.
        'PASSWORD': 'passwd',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
TIME_ZONE = 'America/Chicago'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = True

# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = ''

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = ''

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
#STATIC_ROOT = os.path.join(HERE, 'static').replace('\\','/')

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'
#STATIC_ROOT = os.path.join(HERE, 'static').replace('\\','/')
S= os.path.join(HERE, 'static').replace('\\','/')

# Additional locations of static files
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    '/home/zdm/static',
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

# Make this unique, and don't share it with anybody.
SECRET_KEY = '9a7!^gp8ojyk-^^d@*whuw!0rml+r+uaie4ur$(do9zz_6!hy0'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'zdm.urls'

# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'zdm.wsgi.application'

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    '/home/zdm/templates',
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'zdm',
    'portal',
    'admin',
    'tagging',
)
Run Code Online (Sandbox Code Playgroud)

Ric*_*Ric 411

Django 1.5引入了出于安全原因所需的允许主机设置.使用Django 1.5创建的设置文件包含您需要添加的新部分:

# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.9/ref/settings/#allowed-hosts
ALLOWED_HOSTS = []
Run Code Online (Sandbox Code Playgroud)

在这里添加您的主机['www.beta800.net']['*']进行快速测试,但不要['*']用于生产.

  • 哇 - 这让我们很难受.这个设置隐藏在文档中真的很糟糕.我们的生产站点无法使用DEBUG = False.谢谢你指出这个!!! (31认同)
  • 有时我想知道为什么Django变得越来越迟钝!当然,这些人比我更好的程序员,但我真的不明白在应用程序级别"修复"漏洞的决定,当真正和干净的行动是正确配置服务器时."模板缓存"和"持久连接"也是如此......永远不会在严肃网站中使用的无用代码; 仍然被视为编程的圣杯!也许只是我,我以前错了! (7认同)
  • 有关引入此设置的安全问题的更多信息:[实际HTTP主机标头攻击](http://www.skeletonscribe.net/2013/05/practical-http-host-header-attacks.html).肯定会说服你不要在生产中使用`['*']`. (4认同)
  • BL.他们甚至不把它作为一个默认值粘贴在settings.py中,也许带有一个扩展注释...... (4认同)
  • 没关系,发现了问题.当静态尚未收集时,它与`django-pipeline`的行为有关.作为一般提示,在Django的`handle_uncaught_exception`方法中放置一个断点将帮助你弄清楚这里发生了什么. (3认同)

squ*_*org 41

我知道这已经晚了但是我最终在这里搜索了我的错误500 DEBUG=False,在我的情况下它确实是ALLOWED_HOSTSos.environ.get('variable')用来填充主机,我没有注意到这一点,直到我启用日志记录,你可以使用以下内容将所有错误记录到文件,即使在以下情况下也会记录DEBUG=False:

# settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt' : "%d/%b/%Y %H:%M:%S"
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': 'mysite.log',
            'formatter': 'verbose'
        },
    },
    'loggers': {
        'django': {
            'handlers':['file'],
            'propagate': True,
            'level':'DEBUG',
        },
        'MYAPP': {
            'handlers': ['file'],
            'level': 'DEBUG',
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.在使用生产设置之后简单地询问框架本身有什么问题,而不是试图猜测,这更有用. (14认同)
  • 事实上,这不是在黑暗中四处游荡的东西.只需查看使用此方法通常会看到的错误消息.在我的情况下,我在我的应用程序正在寻找的settings.py中缺少一个不同的设置.我只需要记录下来的日志.一个重要的注意事项:我在'mysite.log'之前添加了/ path/to/my/django /,如文档示例所示:https://docs.djangoproject.com/en/1.10/topics/logging/#examples (4认同)
  • 我花了几个小时寻找解决方案,没用.根据这个答案只是使用日志记录,你应该有你的问题,这是最好的答案.谢谢OP! (4认同)
  • 谢谢!这解决了我的错误。原来,我需要运行collectstatic来从程序包中收集一些静态资产。 (3认同)

Kyl*_*son 25

我刚刚在Django 2.0中遇到了同样的问题.我能够通过设置找出问题DEBUG_PROPAGATE_EXCEPTIONS = True.请参见:https://docs.djangoproject.com/en/2.0/ref/settings/#debug-propagate-exceptions

就我而言,错误是ValueError: Missing staticfiles manifest entry for 'admin/css/base.css'.我通过本地运行来修复它python manage.py collectstatic.

  • 为什么这么低?无论错误的原因是什么,这都会有所帮助。 (6认同)
  • 这应该是“如何在 Django 中调试 500 错误”问题的答案。 (4认同)

Kho*_*Phi 22

在我的情况下,阅读第三方应用程序的文档正确地保存了我.

罪魁祸首?django_compressor

我有

{% load compress %}
{% compress css %}
 ... css files linked here ..
{% endcompress %}
Run Code Online (Sandbox Code Playgroud)

DEBUG = True 总是给我500.要修复它,我需要在我的设置中使用一行来让它运行

COMPRESS_ENABLED = os.environ.get('COMPRESS_ENABLED', False)
Run Code Online (Sandbox Code Playgroud)


小智 13

对,在Django 1.5中如果DEBUG = False,配置ALLOWED_HOSTS,添加没有端口号的域.例:

ALLOWED_HOSTS = ['localhost']
Run Code Online (Sandbox Code Playgroud)


小智 10

您还必须在整个地方检查您的网址.当DEBUG设置False为时,所有没有尾随的URL /都被视为一个bug,与你有的不同DEBUG = True,在这种情况下,Django会/在它丢失的任何地方附加.因此,简而言之,确保所有链接都以斜线结尾.

  • 只需使用reverse和url标签就可以了 (3认同)

aar*_*lhe 8

2019 年年中,我在使用 Django 开发几年后遇到了这个错误。迷惑了我一整夜!不允许主机(应该抛出 400),检查其他所有内容,最后做了一些错误记录,结果发现一些丢失/或混乱的静态文件清单(在 collectstatic 之后)与设置有关。长话短说,对于那些被难倒并且正在使用 WHITENOISE 或带有缓存的 DJANGO 静态文件后端(清单静态文件)的人来说,也许这适合你。

  1. 确保您设置了所有内容(就像我为 whitenoise 后端所做的那样... django 后端仍然阅读) http://whitenoise.evans.io/en/stable/django.html

  2. 如果错误代码 500 仍然让您失望,请注意您的 settings.STATICFILES_STORAGE。

将其设置为任一(对于带有压缩的白噪声后端)

STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
Run Code Online (Sandbox Code Playgroud)

或(保留 django 默认值)

STATICFILES_STORAGE = django.contrib.staticfiles.storage.StaticFilesStorage
Run Code Online (Sandbox Code Playgroud)

总而言之,问题似乎来自于这个白噪声缓存 + 压缩后端 -->

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
Run Code Online (Sandbox Code Playgroud)

或 django 自己的缓存后端 -->

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
Run Code Online (Sandbox Code Playgroud)

...对我来说不是很好,因为我的 css 引用了一些其他来源,这些来源可能在 collectstatic / 后端缓存期间混淆。这个问题也可能在http://whitenoise.evans.io/en/stable/django.html#storage-troubleshoot 中突出显示

  • 更改为这个 - `whitenoise.storage.CompressedStaticFilesStorage` - 对我有用。 (3认同)

小智 7

我有一个热闹的故事.到达这个页面后,我说"尤里卡!我得救了.那一定是我的问题." 所以我ALLOWED_HOSTS在setting.py中插入了所需的列表,并且......没有.相同的旧500错误.不,它不是因为缺少404.html文件.

因此,在2天的时间里,我忙于疯狂的理论,例如它与服务静态文件有关(理解我是菜鸟,而且新手不知道他们在做什么).

那是什么?现在是主持人,我们得到了一个有用的提示.虽然我的开发Django是版本1.5.something,我的生产服务器版本是1.5.something + 1 ...或者可能加上2.无论如何.所以在我添加ALLOWED_HOSTS到桌面版本的settings.py之后,缺少hwjp所要求的 - 一个"settings.py中的默认值,也许带有解释性注释"---我在生产服务器上做了同样的事情适当的域名.

但我没注意到在生产服务器上使用更高版本的Django,在settings.py中有一个带有解释性注释的默认值.它远远低于我进入的地方,在显示器上看不到.当然,这份清单是空的.因此我浪费时间.

  • 我有完全一样的搞笑模式!,只是在我发现这个之后才变得很搞笑,谢谢。在此之前,这只是令人沮丧 (2认同)

use*_*054 6

对于它的价值 - 我DEBUG = False只在某些页面上获得了500 .用pdb追溯异常显示缺少资产(我怀疑{% static ... %}模板标签是500的罪魁祸首.

  • 这里的解决方案相同 - 我使用`static`来包含一个不存在的CSS文件. (2认同)

ePi*_*314 6

补充主要答案在开发和生产之间切换时
更改ALLOWED_HOSTS和DEBUG全局常量很烦人settings.py.我正在使用此代码自动设置这些设置:

import socket

if socket.gethostname() == "server_name":
    DEBUG = False
    ALLOWED_HOSTS = [".your_domain_name.com",]
    ...
else:
    DEBUG = True
    ALLOWED_HOSTS = ["localhost", "127.0.0.1",]
    ...
Run Code Online (Sandbox Code Playgroud)

如果您使用macOS,您可以编写更通用的代码:

if socket.gethostname().endswith(".local"): # True in your local computer
    DEBUG = True
    ALLOWED_HOSTS = ["localhost", "127.0.0.1",]
else:
    ...
Run Code Online (Sandbox Code Playgroud)


小智 6

我知道这是一个非常古老的问题,但也许我可以帮助其他人。如果您在设置 DEBUG=False 后遇到 500 错误,您始终可以在命令行中运行 manage.py runserver 来查看不会出现在任何 Web 错误日志中的任何错误。


Ali*_*ani 5

我做的时候遇到了同样的问题DEBUG = FALSE.这是一个综合解决方案,分散在上面和其他帖子的答案中.

默认情况下,在settings.py中我们有ALLOWED_HOSTS = [].以下是ALLOWED_HOSTS根据场景可能需要进行的更改,以消除错误:

1:您的域名:

ALLOWED_HOSTS = ['www.example.com'] # Your domain name here
Run Code Online (Sandbox Code Playgroud)

2:如果您还没有域名,那么您已部署的服务器IP(这是我的情况并且像魅力一样工作):

ALLOWED_HOSTS = ['123.123.198.123'] # Enter your IP here
Run Code Online (Sandbox Code Playgroud)

3:如果您在本地服务器上进行测试,则可以编辑您的settings.pysettings_local.py:

ALLOWED_HOSTS = ['localhost', '127.0.0.1']
Run Code Online (Sandbox Code Playgroud)

4:您还可以在ALLOWED_HOSTS值中提供"*",但出于安全原因,不建议在生产环境中使用它:

ALLOWED_HOSTS = ['*'] # Not recommended in production environment
Run Code Online (Sandbox Code Playgroud)

我还在我的博客上发布了一个您可能想要参考的详细解决方案.


amc*_*h89 5

ALLOWED_HOSTS并不是唯一的问题,对我而言,我必须创建一个404.html并将其放在模板的基本级别(而非应用程序级别)中-另外,您可以创建404视图并添加404handler网址,但我认为可选的。404.html修复了它

在mainproject.urls中

handler404 = 'app.views.custom_404'
Run Code Online (Sandbox Code Playgroud)

在app.views中

def custom_404(request):
    return render(request, '404.html', {}, status=404)
Run Code Online (Sandbox Code Playgroud)

然后制作一个template / 404.html模板

是从另一个S / O帖子获得的,我找不到它

编辑

同样,当我为带有白噪声的资产提供服务时,会出现500个错误。无法弄清楚我的一生,错误是whitenoise的ValueError无法找到我也找不到的资产,现在必须使用默认的Django服务

  • 我对白噪声也有同样的问题。`python manage.py collectstatic`修复了它。 (7认同)

小智 5

我正在搜索和测试有关此问题的更多信息,我意识到在settings.py中指定的静态文件目录可能是导致此问题的原因,因此,首先,我们需要运行此命令

python manage.py collectstatic
Run Code Online (Sandbox Code Playgroud)

在settings.py中,代码应如下所示:

STATIC_URL = '/static/'

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

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Run Code Online (Sandbox Code Playgroud)