Установка DEBUG = False вызывает ошибку 500
Как только я изменю DEBUG = False
, мой сайт будет генерировать 500 (используя wsgi и manage.py runningerver), и в журнале ошибок 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', '[email protected]'),
)
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-^^[email protected]*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 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',
)
Ответы
Ответ 1
В 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']
или ['*']
для быстрого теста, но не используйте ['*']
для производства.
Ответ 2
Я знаю, что это поздно, но я оказался здесь с поиском моей ошибки 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',
},
}
}
Ответ 3
В моем случае, чтение документов сторонних приложений правильно спасло меня.
Преступник? django_compressor
У меня был
{% load compress %}
{% compress css %}
... css files linked here ..
{% endcompress %}
DEBUG = True
всегда давал мне 500. Чтобы исправить это, мне понадобилась строка в моих настройках, чтобы запустить ее
COMPRESS_ENABLED = os.environ.get('COMPRESS_ENABLED', False)
Ответ 4
Я столкнулся с той же проблемой совсем недавно в 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
.
Ответ 5
Правильно, в Django 1.5, если DEBUG = False, настройте ALLOWED_HOSTS, добавив домены без номера порта. Пример:
ALLOWED_HOSTS = ['localhost']
Ответ 6
Вы также должны проверять свои URL-адреса повсеместно. Если для параметра DEBUG
установлено значение False
, все URL-адреса без привязки /
рассматриваются как ошибка, в отличие от того, когда у вас есть DEBUG = True
, и в этом случае Django будет добавлять /
везде, где он отсутствует. Итак, короче говоря, убедитесь, что все ссылки заканчиваются косой чертой. ВЕРНУТЬСЯ.
Ответ 7
У меня есть веселая история для всех. Достигнув этой страницы, я сказал: "Эврика! Я спасен. Это ДОЛЖНО быть моей проблемой". Поэтому я вставил требуемый ALLOWED_HOSTS
список в settings.py и... ничего. Такая же старая ошибка 500. И нет, это было не из-за отсутствия файла 404.html.
Итак, в течение 2 дней я занимался дикими теориями, такими как то, что он имел какое-то отношение к обслуживанию статических файлов (понимайте, что я нооб, а noobs не знают, что они делают).
Так что же это? Сейчас г-н Модератор пришел к полезному совету. В то время как моя разработка Django - это версия 1.5.something, моя версия серверного продукта - 1.5.something + 1... или, возможно, плюс 2. Независимо от того. Итак, после того, как я добавил ALLOWED_HOSTS
в настольную версию settings.py, которой не хватало запрошенного hwjp --- значение по умолчанию в settings.py, возможно, с пояснительным комментарием --- я сделал то же самое на производственный сервер с соответствующим доменом для него.
Но я не заметил, что на рабочем сервере с более поздней версией Django существует значение по умолчанию в settings.py с пояснительным комментарием. Это было значительно ниже, где я сделал свой вход, вне поля зрения на мониторе. И, конечно, список был пуст. Отсюда моя трата времени.
Ответ 8
Для чего это стоит - я получал 500 с DEBUG = False
только на некоторых страницах. Отслеживание исключения с pdb выявило недостающий ресурс (я подозреваю, что тег шаблона {% static ... %}
был виновником 500.
Ответ 9
Я столкнулся с той же проблемой, когда сделал 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
Я также разместил подробное решение в своем блоге, которое вы можете захотеть сослаться.
Ответ 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:
...
Ответ 11
ALLOWED_HOSTS НЕ является единственной проблемой, для меня я должен был сделать 404.html и разместить его на базовом уровне моих шаблонов (не на уровне приложения). Также вы можете сделать 404-представление и добавить URL-адрес 404handler, но Я думаю, что это необязательно. 404.html исправил его
в mainproject.urls
handler404 = 'app.views.custom_404'
в app.views
def custom_404(request):
return render(request, '404.html', {}, status=404)
затем создайте шаблон шаблона /404.html
получил это от другого сообщения S/O, которое я не могу найти
ИЗМЕНИТЬ
Кроме того, я получаю 500 ошибок, когда я обслуживаю активы с помощью whitenoise. Не могу понять, что из-за жизни меня ошибка: ValueError из whitenoise, неспособный найти объект, который я также не мог найти, должен был пойти со стандартным django, служащим на данный момент
Ответ 12
Я искал и тестировал больше об этой проблеме, и я понял, что причиной этого могут быть каталоги статических файлов, указанные в 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')
Ответ 13
Я знаю, что это супер старый вопрос, но, возможно, я мог бы помочь кому-то другому. Если после установки DEBUG = False у вас есть ошибка 500, вы всегда можете запустить run.py в командной строке, чтобы увидеть какие-либо ошибки, которые не будут отображаться в каких-либо журналах веб-ошибок.
Ответ 14
Я думаю, что это могут быть настройки http-сервера. Шахта все еще сломана и все время была ALLOWED_HOSTS. Я могу получить доступ к нему локально (я использую gunicorn), но не через доменное имя, когда DEBUG = False. когда я пытаюсь использовать доменное имя, оно дает мне ошибку, поэтому я думаю, что это проблема, связанная с nginx.
Вот мой файл conf для 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;
}
Ответ 15
У меня подобная проблема, в моем случае это вызвано тем, что в теге body есть комментарий script.
<!--<script> </script>-->
Ответ 16
Я столкнулся с этой проблемой. Оказывается, я включал в шаблон, используя тег static
template, файл, который больше не существует. Взгляд в журналах показал мне проблему.
Я думаю, это всего лишь одна из многих возможных причин такого рода ошибок.
Мораль истории: всегда регистрировать ошибки и всегда проверять журналы.
Ответ 17
Благодаря @squarebear, в файле журнала я обнаружил ошибку: ValueError: The file 'myapp/styles.css' could not be found with <whitenoise.storage.CompressedManifestStaticFilesStorage...>
.
У меня было несколько проблем в моем приложении Django. Я убрал строку
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
который я нашел в документации по heroku.
Мне также пришлось добавить дополнительную директорию (благодаря другому ответу SO) static
в корень приложения django как myapp/static
даже если я не использовал его. Затем выполнение команды python manage.py collectstatic
перед запуском сервера решило проблему. Наконец-то все заработало.
Ответ 18
Середина 2019 года, и я столкнулся с этой ошибкой после нескольких лет разработки с Django. Озадачил меня всю ночь! Это не было разрешено хосту (который должен выдать 400), все остальное было проверено, в конце концов, сделал некоторую регистрацию ошибок только для того, чтобы обнаружить, что некоторые отсутствующие/или испорченные манифесты статических файлов (после collectstatic) были испорчены при установке. Короче говоря, для тех, кто в замешательстве И ТАК, ЧТО ПРОИЗОЙДЕТ ИСПОЛЬЗОВАТЬ WHITENOISE ИЛИ STANICFILE BACKEND С CACHE (манифест статических файлов), возможно, это для вас.
-
Убедитесь, что вы все настроили (как я делал для бэкэнда whitenoise... бэкэнды django читайте дальше) http://whitenoise.evans.io/en/stable/django.html
-
Если код ошибки 500 все еще сбивает вас с толку, обратите внимание на ваши настройки .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 ссылался на некоторые другие источники, которые могут быть перепутаны во время кеширования сборщика/бэкэнда. Эта проблема также потенциально освещается в http://whitenoise.evans.io/en/stable/django.html#storage-troubleshoot
Ответ 19
Я начал получать 500 для отладки = False в виде
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.
Ответ 20
Я знаю, что это старый вопрос, но у меня также была ошибка 500, когда DEBUG = False. Через несколько часов я понял, что забыл закончить некоторые ссылки в моем base.html с завершающим косой чертой.
Ответ 21
Это старое, и моя проблема закончилась тем, что связана с проблемой, но не для OP, но мое решение для всех, кто пробовал это, бесполезно.
У меня была настройка в модифицированной версии Django для минимизации CSS и JS файлов, которые выполнялись только тогда, когда DEBUG был выключен. Мой сервер не установил CSS minifier и выбросил ошибку. Если вы используете Django-Mako-Plus, это может быть вашей проблемой.
Ответ 22
Следует отметить одну маленькую вещь: если в массиве нет 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
Ответ 23
Немного поздно для вечеринки, и, конечно же, может существовать легион проблем, но у меня была аналогичная проблема, и оказалось, что у меня есть {%%} специальные символы внутри моего комментария html...
<!-- <img src="{% static "my_app/myexample.jpg" %}" alt="My image"/> -->
Ответ 24
У меня было одно представление, которое запустило ошибку 500 в debug = false, но работало в debug = true. Для тех, кто получает такие вещи и "Разрешенные хосты", это не проблема, я исправил свой взгляд, обновив статический тег шаблона, который указывал на неправильное местоположение.
Итак, я бы предложил просто проверять ссылки и теги на воздухонепроницаемость в любых используемых шаблонах, возможно, некоторые вещи проскальзывают через сеть в отладке, но дают ошибки в производстве.
Ответ 25
Я нашел еще одну причину ошибки 500, когда DEBUG = False. Я использую утилиту Django compressor
, и наш главный инженер добавил ссылки на файлы шрифтов внутри блока compress css
в шаблоне Django. Вот так:
{% 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
.
Ответ 26
У меня была проблема, похожая на эту, и я сообщу, как я решил мою, потому что может быть, что кто-то тоже испытывает то же самое.
В моем случае ошибка была вызвана тем, что сервер не обнаружил статические файлы с домашней страницы.
Поэтому убедитесь, что ошибка возникает только в index
или на другой странице. Если проблема возникает только в индексе, очень вероятно, что вам нужно проверить статические файлы. Я рекомендую открыть консоль предварительного просмотра Chrome и проверить наличие ошибок.
В моем случае серверу не удалось найти favicon.ico
и два других CSS.
Чтобы это исправить, я прошел python manage.py collectstatic
, и это сработало.
Ответ 27
Если вы хотите разрешить все хосты.
Используйте ALLOWED_HOSTS = ['*',]
вместо
ALLOWED_HOSTS = ['*']