设置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', ) 

Django 1.5引入了出于安全原因需要的允许主机设置 。 用Django 1.5创build的设置文件有这个新的部分,你需要添加:

 # 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']['*']进行快速testing, 但不要使用['*']进行生产 。

就我而言,阅读第三方应用程序的文档正确地保存了我。

罪魁祸首? django_compressor

我有

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

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

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

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

 ALLOWED_HOSTS = ['localhost'] 

我知道这是迟到了,但我最终在这里与DEBUG=Falsesearch我的错误500,在我的情况下,它确实是ALLOWED_HOSTS但我使用os.environ.get('variable')来填充主机,我没有注意到这一点,直到我启用日志logging,您可以logging所有的错误与下面的文件,即使当DEBUG=False时,它会logging:

 # 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', }, } } 

你还必须检查你的url到处都是。 当DEBUG设置为False ,所有不带尾随/ URL都被视为一个错误,与DEBUG = True ,在这种情况下,Django将追加到/缺失的任何地方。 所以,总之,要确保所有的链接都以斜线结束。

我有一个热闹的故事。 到达这个页面后,我说:“尤里卡,我得救了,那一定是我的问题。” 所以我在ALLOWED_HOSTS中插入了所需的ALLOWED_HOSTS列表,并且没有任何东西。 相同的旧500错误。 不,这不是因为缺乏一个404.html文件。

所以在这两天里,我忙于自己的狂野理论,比如与静态文件服务有关(了解我是一个noob,而noobs不知道他们在做什么)。

那是什么? 现在是主持人,我们来一个有用的提示。 而我的发展Django版本是1.5的东西,我的生产服务器版本是1.5.something + 1 …或者加上2.无论如何。 因此,在将ALLOWED_HOSTS添加到settings.py的桌面版本之后,缺lesshwjp请求的内容 – “settings.py中的默认值,可能有解释性注释”—我在生产服务器上做了相同的与它的适当的领域。

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

当我做DEBUG = FALSE时遇到同样的问题。 这是一个整合的解决scheme,分散在上面的答案和其他职位。

默认情况下,在settings.py中我们有ALLOWED_HOSTS = [] 。 这里有可能的变化,你必须在ALLOWED_HOSTS值作为每个scheme来摆脱错误:

1:您的域名:

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

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

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

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

 ALLOWED_HOSTS = ['localhost', '127.0.0.1'] 

4:您也可以在ALLOWED_HOSTS值中提供“*”,但由于安全原因, 不build议在生产环境中使用它:

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

我也在我的博客上发布了一个您可能想要参考的详细解决scheme。

ALLOWED_HOSTS不是唯一的问题,对我来说,我不得不做一个404.html,并把它放在我的模板(而不是应用程序级别)的基本级别 – 此外,你可以做一个404视图,并添加404处理程序的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 / Opost得到这个,我找不到它

编辑

而且,当我用whitenoise服务资产时,我会得到500个错误。 无法弄清楚为我的生活,错误是从Whitenoise ValueError不能find一种资产,我也找不到,必须与默认Django服务现在

对于什么是值得的 – 我只在一些页面上得到一个500 DEBUG = False 。 用pdb追溯exception显示缺less资产(我怀疑{% static ... %}模板标签是500的罪魁祸首。

补充主要答案
在生产或开发中改变ALLOWED_HOSTS和DEBUG设置是令人讨厌的
我正在使用此代码自动设置这些设置

 import socket if socket.gethostname() == "local computer name": DEBUG = True ALLOWED_HOSTS = ["localhost", "127.0.0.1",] else: DEBUG = False ALLOWED_HOSTS = [".your_domain_name.com",] 

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

我认为这也可能是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; } 

我有类似的问题,在我的情况下,它是由正文标记内的评论脚本引起的。

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

我正在search和testing更多关于这个问题,我意识到settings.py中指定的静态文件direcotiries可以是这样的一个原因,所以拳头,我们需要运行此命令

 python manage.py collecstatic 

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

 STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') 

我知道这是一个老问题,但是当DEBUG = False时,我也遇到了500错误。 几个小时后,我意识到我已经忘记结束我的ba​​se.html中的一些链接,并附有斜线。

这是旧的,我的问题最终与问题有关,但不是为了OP,但我的解决scheme是任何人尝试上述无济于事。

我有一个Django的修改版本的设置,以缩小只有DEBUGclosures时才运行的CSS和JS文件。 我的服务器没有安装CSS缩小器并抛出错误。 如果你使用的是Django-Mako-Plus,这可能是你的问题。

需要注意的一点是,如果数组中有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

晚了一点晚,当然可能会有一大堆的问题,但我也有类似的问题,事实certificate,我有我的HTML备注中的{%%}特殊字符…

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

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

所以我build议只检查链接和标签密封使用的任何模板,也许某些东西在debugging中通过networking滑落,但在生产中出现错误。

我遇到了这个问题。 事实certificate,我在模板中使用static模板标签,一个不存在的文件。 在日志中查看显示了我的问题。

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

故事的道德:总是logging错误,并总是检查日志。

当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 %} 

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

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