一旦我更改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',
)

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


对于它的价值-我得到了一个500 DEBUG = False在某些页面上。追踪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.py或settings_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帖子中得到的,我找不到它

EDIT

此外,当我使用白噪声服务资产时,我得到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版本1.8.4


补充主要答案 在开发和生产之间切换时,在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. environment .get('变量')来填充主机,我没有注意到这一点,直到我启用日志记录,你可以用下面的文件记录所有错误,即使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时正常工作。对于任何得到这种东西和允许的主机不是问题,我通过更新一个模板的静态标签指向错误的位置来修复我的视图。

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


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

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

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


当DEBUG=False时,我发现了另一个导致500错误的原因。我使用Django压缩工具,我们的前端工程师在Django模板的压缩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文件。


多亏了@squarebear,在日志文件中,我发现了错误: 在<whitenoise.storage中找不到文件'myapp/styles.css'。CompressedManifestStaticFilesStorage…>。

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

我还必须在django应用程序的根目录中添加额外的目录(感谢另一个SO答案),作为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来修复这个问题。


Its mid 2019 and I faced this error after a few years of developing with Django. Baffled me for an entire night! It wasn't allowed host (which should throw a 400), everything else checked out, finally did some error logging only to discover that some missing / or messed up static files manifest (after collectstatic) were screwing with the setup. Long story short, for those who are stumped AND SO HAPPEN ARE USING WHITENOISE OR THE DJANGO STATICFILE BACKEND WITH CACHE (manifest static files) , maybe this is for you.

确保你设置了所有的东西(就像我为白噪音后台所做的一样……Django后端(请继续阅读)http://whitenoise.evans.io/en/stable/django.html 如果错误代码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中被突出


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

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

因此,请确保错误只发生在索引中或发生在另一个页面上。如果问题只发生在索引中,很可能你需要检查静态文件。我建议打开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.serializer . validationerror时

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


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


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

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


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

对于它的价值-我得到了一个500与DEBUG =假在我的网站上的所有页面。

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

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


在settings.py中设置DEBUG = False和ALLOWED_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个