设置 DEBUG = False 会导致 500 错误

一旦我改变了DEBUG = False,我的站点状态码会变成 500 (内部使用 wsgi 和 manage.py runserver), Apache 错误日志中没有错误信息,当我将debug更改为True时,它却可以正常运行。

我使用的是 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"

这是我的设置文件:

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',
)
189708 次浏览

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 = []

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

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

ALLOWED_HOSTS = ['localhost']

您还必须检查所有地方的url。当DEBUG被设置为False时,所有没有/结尾的url都被视为bug,不像你有DEBUG = True时,在这种情况下,Django会在所有缺少/的地方追加/。因此,简而言之,确保所有链接都以斜杠“EVERYWHERE”结束。

我给大家讲个搞笑的故事。翻到这一页后,我说:“尤里卡!我得救了。那一定是我的问题。”所以我插入了所需的ALLOWED_HOSTS列表在setting.py和…什么都没有。同样的500错误。不,这并不是因为缺少404.html文件。

所以在两天的时间里,我忙于各种疯狂的理论,比如它与提供静态文件有关(要知道我是个新手,新手不知道他们在做什么)。

那是什么呢?主持人先生,现在我们来讨论一个有用的建议。而我开发的Django版本是1.5。某某,我的生产服务器版本是1.5.某某+1…或者加2。无论什么。因此,在我将ALLOWED_HOSTS添加到桌面版本的settings.py之后,它缺少hwjp请求的东西——“settings.py中的默认值,可能带有解释性注释”——我在生产服务器上使用正确的域为它做了同样的事情。

但是我没有注意到在生产服务器上的Django的最新版本中,在settings.py中有一个默认值和一个解释性的注释。它远低于我进入的地方,在监视器上看不见。当然,这个列表是空的。因此我浪费了时间。

我认为也可能是http服务器设置。我的仍然是坏的,并有ALLOWED_HOSTS整个时间。我可以在本地访问它(我使用gunicorn),但不是通过域名时DEBUG=False。当我尝试使用域名,然后给我的错误,所以让我认为这是一个nginx相关的问题。

下面是nginx的conf文件:

server {
listen   80;
server_name localhost myproject.ca www.myproject.ca;
root /var/web/myproject/deli_cms;


# serve directly - analogous for static/staticfiles
location /media/ {
# if asset versioning is used
if ($query_string) {
expires max;
}
}
location /admin/media/ {
# this changes depending on your python version
root /var/web/myproject/lib/python2.6/site-packages/django/contrib;
}
location /static/ {
alias /var/web/myproject/deli_cms/static_root/;
}


location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 10;
proxy_read_timeout 10;
proxy_pass http://localhost:8000/;
}
# what to serve if upstream is not available or crashes
error_page 500 502 503 504 /media/50x.html;
}

如果你想允许所有主机。 使用ALLOWED_HOSTS = ['*',] 而不是 ALLOWED_HOSTS = ['*']

为了它的价值-我只在一些页面上得到了DEBUG = False的500分。回溯pdb异常,发现了一个缺失的资产(我怀疑{% static ... %}模板标签是500的罪魁祸首。

我知道这是一个老问题,但是当DEBUG=False时,我也得到了一个500错误。几个小时后,我意识到我忘了在base.html中的一些链接后面加上斜杠。

当我做DEBUG = FALSE时,我也遇到了同样的问题。这里是一个统一的解决方案,分散在上面的答案和其他帖子。

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

1:您的域名:

ALLOWED_HOSTS = ['www.example.com'] # Your domain name here

2:你部署的服务器IP,如果你还没有域名(这是我的情况,工作就像一个魅力):

ALLOWED_HOSTS = ['123.123.198.123'] # Enter your IP here

3:如果你在本地服务器上测试,你可以编辑你的settings.pysettings_local.py为:

ALLOWED_HOSTS = ['localhost', '127.0.0.1']

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

ALLOWED_HOSTS = ['*'] # Not recommended in production environment

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

就我而言,阅读第三方应用程序的文档拯救了我。

罪魁祸首吗?django_compressor

我有

{% load compress %}
{% compress css %}
... css files linked here ..
{% endcompress %}

DEBUG = True总是给我500。为了解决这个问题,我需要在设置中设置一行来让它运行

COMPRESS_ENABLED = os.environ.get('COMPRESS_ENABLED', False)

这是老问题了,我的问题最终与这个问题有关,但不是针对OP,但我的解决方案适用于任何尝试上述方法但无济于事的人。

我在修改过的Django版本中设置了CSS和JS文件,这些文件只在DEBUG关闭时运行。我的服务器没有安装CSS缩小器并抛出错误。如果你正在使用Django-Mako-Plus,这可能是你的问题。

ALLOWED_HOSTS不是唯一的问题,对我来说,我必须做一个404.html,并把它放在我的模板的基础级别(不是应用程序级别)-此外,你可以做一个404视图,并添加一个404handler url,但我认为这是可选的。404.html修复了它

在mainproject.urls

handler404 = 'app.views.custom_404'

在app.views

def custom_404(request):
return render(request, '404.html', {}, status=404)

然后创建templates/404.html模板

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

编辑

此外,当我使用白噪声服务资产时,我得到500个错误。不能为我的生活弄清楚,错误是ValueError从白噪声无法找到一个资产,我也找不到,不得不去默认django服务现在

有一件小事需要注意,如果数组中有None,那么所有后续允许的主机都将被忽略。

ALLOWED_HOSTS = [
"localhost",
None,
'example.com', # First DNS alias (set up in the app)
#'www.example.com', # Second DNS alias (set up in the app)
]

Django version 1.8.4

< p > 补充主要答案 < br > 在开发和生产之间切换时,在settings.py中更改ALLOWED_HOSTS和DEBUG全局常量是令人讨厌的。 我使用这段代码来自动设置这些设置:

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",]
...

如果你使用macOS,你可以写一个更通用的代码:

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

我知道这有点晚了,但我最终在这里用DEBUG=False搜索我的错误500,在我的情况下,它确实是ALLOWED_HOSTS,但我使用os.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',
},
}
}

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

有点晚了,当然可能会有一大堆问题,但我也有类似的问题,原来我的html注释中有{% %}特殊字符……

<!-- <img src="{% static "my_app/myexample.jpg" %}" alt="My image"/> -->

我有类似的问题,在我的情况下,这是由于有一个评论脚本在正文标签。

<!--<script>  </script>-->

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

python manage.py collectstatic

在settings.py中,代码应该是这样的:

STATIC_URL = '/static/'


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


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

我有一个视图在debug=false时抛出了500个错误,但在debug=true时正常工作。对于任何得到这种东西和允许的主机不是问题,我通过更新一个模板的静态标签指向错误的位置来修复我的视图。

所以我建议只检查链接和标签在使用的任何模板中是密封性的,也许某些东西在调试中会漏网之鱼,但在生产中会产生错误。

我遇到了这个问题。原来我在模板中使用static模板标记,包含了一个不再存在的文件。看了一下日志,我发现了问题。

我想这只是造成这种错误的众多可能原因之一。

这个故事的寓意是:总是记录错误,总是检查日志。

当DEBUG=False时,我发现了另一个导致500错误的原因。我使用Django的compressor实用程序,我们的前端工程师在Django模板中添加了对字体文件内部compress css块的引用。是这样的:

{% compress css %}
<link href="{% static "css/bootstrap.css" %}" rel="stylesheet">
<link href="{% static "css/bootstrap-spinedit.css" %}" rel="stylesheet">
<link href="{% static "djangular/css/styles.css" %}" rel="stylesheet">
<link href="{% static "fonts/fontawesome-webfont.ttf" %}" rel="stylesheet">
{% endcompress %}

解决方案是将链接移动到ttf文件下面的endcompress行。

多亏了@squarebear,在日志文件中,我发现了错误: ValueError: The file 'myapp/styles.css' could not be found with <whitenoise.storage.CompressedManifestStaticFilesStorage ...>。< / p > 我在django应用程序中遇到了一些问题。我删除了
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage',我发现从heroku的文档。< / p >

我还必须在django应用程序的根目录中添加额外的目录(感谢另一个SO答案) static作为myapp/static,即使我没有使用它。然后在运行服务器之前运行命令python manage.py collectstatic来解决这个问题。最后,它开始正常工作。

我最近在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来修复这个问题。

现在是2019年年中,在用Django开发了几年之后,我遇到了这个错误。让我困惑了一整晚!它不允许主机(这应该抛出一个400),其他一切检查出来,最后做了一些错误日志,只是发现一些丢失/或混乱的静态文件清单(在collectstatic之后)正在搞砸设置。长话短说,对于那些正在使用WHITENOISE或带有缓存的DJANGO STATICFILE后台(manifest静态文件)的人来说,也许这是为你准备的。

  1. 确保你设置了所有的东西(就像我为白噪音后台所做的一样……Django backends read on anyway) http://whitenoise.evans.io/en/stable/django.html

  2. 如果错误代码500仍然使您失败,请注意您的设置。

将其设置为任意一个(用于压缩后端白噪声)

STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'

或者(保留django默认值)

STATICFILES_STORAGE = django.contrib.staticfiles.storage.StaticFilesStorage

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

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

或者django自己的缓存后端——>

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

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

我也遇到过类似的问题,我将报告我是如何解决我的问题的,因为可能有人也有同样的经历。

在我的例子中,错误是因为服务器没有从主页中找到一些静态文件而引起的。

因此,请确保错误只发生在index中或发生在另一页上。如果问题只发生在索引中,很可能你需要检查静态文件。我建议打开Chrome预览控制台,检查是否有任何错误。

在我的例子中,服务器无法找到favicon.ico和其他两个CSS。

为了解决这个问题,我传递了python manage.py collectstatic,它工作了。

我开始以debug=False的形式得到500

django.urls.exceptions.NoReverseMatch: Reverse for 'home' not found.
or...
django.urls.exceptions.NoReverseMatch: Reverse for 'about' not found.

当抛出django.core.exceptions.ValidationError而不是rest_framework.serializers.ValidationError

公平地说,它之前已经引发了一个500,但作为一个ValidationError, debug=False,这变成了NoReverseMatch。

这可能会帮助其他人,在我的情况下,丢失图标的问题。

好的,在尝试了这么多事情之后,正确的解决方法是……

你需要设置DEBUG = 'FALSE'而不是FalseFALSE,而是'FALSE'''

我知道这篇文章很老了,但今天仍然非常有意义。

为了它的价值-我在我的网站上的所有页面都得到了一个500 DEBUG = False

在调试时,我没有得到回溯。

我不得不在我的网站中浏览模板中的每个静态链接,并在我的图像源前面找到了一个/(正斜杠)。{%静态…%}。这导致了DEBUG = False中的500错误,但在Debug = True中工作得很好,没有错误。很烦人!警告!由于向前斜杠浪费了很多时间…

你可能想在settings.py中设置DEBUG = FalseALLOWED_HOSTS = ['127.0.0.1']之后运行python manage.py collectstatic。在这两个步骤之后,我的web应用程序在我的本地服务器上运行良好,即使使用DEBUG=False模式。

顺便说一句,我在settings.py中有这些设置。

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', # what i added
'django.middleware.common.CommonMiddleware', # and so on...
]


STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

我认为可能白噪声设置与collectstatic命令有关。

我的问题是在错误的404.html模板-我复制&粘贴

<a href="{% url 'home:index' %}">

而不是(对我来说)

 <a href="{% url 'posts:index' %}">

这就是为什么会出现500个