316

一旦我更改了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"

这是我的设置文件:

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',
)
4

32 回答 32

421

出于安全原因,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']['*']用于快速测试,但不要['*']用于生产

于 2013-02-28T05:43:00.677 回答
70

我知道这已经晚了,但我最终在这里搜索了我的错误 500 DEBUG=False,在我的情况下,它确实是,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',
        },
    }
}
于 2016-05-13T20:02:23.167 回答
50

我最近在 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

于 2018-02-10T19:16:28.290 回答
27

In my case, reading docs of third party apps properly saved me.

The culprit? django_compressor

I had

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

DEBUG = True always gave me 500. To fix it, I needed a line in my settings to get it running

COMPRESS_ENABLED = os.environ.get('COMPRESS_ENABLED', False)
于 2015-06-22T19:03:09.773 回答
13

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

ALLOWED_HOSTS = ['localhost']
于 2013-05-17T15:35:51.203 回答
12

您还必须到处检查您的网址。当DEBUG设置为 时False,所有没有尾随的 URL/都将被视为错误,与您设置时不同DEBUG = True,在这种情况下,Django 将/在丢失的任何地方追加。所以,简而言之,确保所有链接都以斜线结尾。

于 2013-06-18T08:23:41.587 回答
10

补充主要答案在开发和生产之间切换时
更改 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",]
    ...

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

if socket.gethostname().endswith(".local"): # True in your local computer
    DEBUG = True
    ALLOWED_HOSTS = ["localhost", "127.0.0.1",]
else:
    ...
于 2016-05-06T23:44:40.997 回答
9

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

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

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

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

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 引用了一些其他来源,这些来源可能在 collectstatic / 后端缓存期间混淆。这个问题也可能在http://whitenoise.evans.io/en/stable/django.html#storage-troubleshoot中突出显示

于 2019-05-22T15:02:48.663 回答
7

我有一个有趣的故事。到达此页面后,我说“尤里卡!我得救了。这一定是我的问题。” 所以我在 setting.py 中插入了所需的ALLOWED_HOSTS列表,然后......什么也没有。相同的旧 500 错误。不,这不是因为缺少 404.html 文件。

所以这两天我忙于疯狂的理论,比如它与提供静态文件有关(理解我是一个菜鸟,菜鸟不知道他们在做什么)。

那是什么?现在是主持人先生,我们来了一个有用的提示。而我的开发 Django 版本是 1.5.something,我的生产服务器版本是 1.5.something+1... 或者可能加 2。随便。因此,在我将settings.pyALLOWED_HOSTS添加到桌面版本之后,它缺少 hwjp 请求的内容——“settings.py 中的默认值,可能带有解释性注释”——我在生产服务器上做了同样的事情它的正确域。

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

于 2013-10-09T09:55:32.057 回答
7

我正在搜索和测试有关此问题的更多信息,我意识到在 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')
于 2017-04-30T00:59:36.770 回答
6

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

于 2014-01-05T18:36:43.663 回答
6

ALLOWED_HOSTS is NOT the only issue, for me I had to make a 404.html and put it in the base level of my templates (not app level) - Also, you can make a 404 view and add a 404handler url but I think thats optional. 404.html fixed it

in mainproject.urls

handler404 = 'app.views.custom_404'

in app.views

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

then make a templates/404.html template

got this from another S/O post that I cannot find it

EDIT

also, I get 500 errors when I serve assets with whitenoise. Could not figure that out for the life of me, error was ValueError from whitenoise not being able to find an asset that I also could not find, had to go with default django serving for now

于 2015-11-23T18:17:31.823 回答
6

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

于 2016-06-24T20:28:44.733 回答
5

当我这样做时,我遇到了同样的问题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.py或编辑settings_local.py为:

ALLOWED_HOSTS = ['localhost', '127.0.0.1']

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

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

我还在我的博客上发布了详细的解决方案,您可能需要参考。

于 2015-02-02T06:58:56.503 回答
3

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

顺便说一句,我在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 命令有关。

于 2020-05-20T05:25:13.737 回答
2

我有类似的问题,在我的情况下,它是由于在 body 标记内有一个 Commented 脚本引起的。

<!--<script>  </script>-->
于 2017-04-18T19:19:48.247 回答
2

我知道这篇文章已经很老了,但它今天仍然完全相关。

DEBUG = False对于它的价值 - 我的网站上的所有页面都获得了 500分。

我在调试时没有回溯。

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

于 2020-04-30T15:06:41.567 回答
2

这可能对其他人有所帮助,在我的情况下是缺少图标的问题。

于 2020-02-15T00:35:55.827 回答
1

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

这是我的 nginx 配置文件:

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;
}
于 2013-10-10T18:06:10.960 回答
1

我遇到了这个问题。原来我在模板中包含了static一个不再存在的文件,使用模板标签。查看日志向我显示了问题。

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

故事的寓意:始终记录错误并始终检查日志。

于 2017-09-18T10:39:04.573 回答
1

感谢@squarebear,在日志文件中,我发现了错误: ValueError: The file 'myapp/styles.css' could not be found with <whitenoise.storage.CompressedManifestStaticFilesStorage ...>.

我的 django 应用程序有一些问题。我删除了
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'从 heroku 的文档中找到的行。

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

于 2017-12-26T13:56:22.003 回答
1

我开始以以下形式获得 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。

于 2019-08-27T20:30:27.300 回答
1

聚会有点晚了,当然可能会有很多问题,但我遇到了类似的问题,结果发现我的 html 备注中有 {% %} 特殊字符......

<!-- <img src="{% static "my_app/myexample.jpg" %}" alt="My image"/> -->
于 2016-10-29T10:22:46.450 回答
0

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

于 2015-01-10T01:35:11.437 回答
0

我有一个视图在 debug=false 中抛出 500 错误,但在 debug=true 中工作。对于遇到这种情况并且允许的主机不是问题的任何人,我通过更新指向错误位置的模板的静态标签来修复我的观点。

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

于 2017-05-02T12:23:56.573 回答
0

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

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

而不是(在我的情况下)

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

这就是为什么出现 500

于 2022-01-23T20:56:29.533 回答
0

这是旧的,我的问题最终与问题有关,但与 OP 无关,但我的解决方案适用于尝试上述方法无济于事的其他人。

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

于 2015-10-07T20:53:04.013 回答
0

需要注意的一件小事,如果数组中包含 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

于 2016-03-01T15:05:22.513 回答
0

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

在我的情况下,错误是由于服务器没有从主页中找到一些静态文件引起的。

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

就我而言,服务器找不到favicon.ico其他两个 CSS。

为了解决这个问题,我通过了python manage.py collectstatic,它奏效了。

于 2019-07-18T22:10:49.387 回答
0

当 DEBUG=False 时,我发现了另一个导致 500 错误的原因。我使用 Djangocompressor实用程序,我们的前端工程师在 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

于 2017-10-10T20:39:48.323 回答
-5

好吧,在尝试了很多事情之后,正确的解决方案是......

您需要设置DEBUG = 'FALSE'not Falseor FALSE,但'FALSE'使用''

于 2020-03-21T16:18:36.593 回答
-6

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

于 2013-12-17T06:51:12.653 回答