Питання Встановлення DEBUG = Помилка причина 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',
)

261
2018-02-28 05:27


походження


Так, я додаю 403 і 404 500 файлів html у мої шаблони dir - zhiguo.wang
У вас є 500.html і 404.html та 403.html файли? Я думаю, що я згадую про наявність проблеми з розгорнутим проектом, який не мав цих файлів у кореневому каталозі мого шаблону. - esse
Якщо ваш сайт генерує помилку 500, в журналі apache повинна бути деяка інформація, можливо, ви захочете пройти частину кінця файлу журналу помилок, щоб люди могли їх переглянути. - esse
Можливо, ви захочете змінити свій SECRET_KEY зараз, коли воно є загальнодоступним ... - Fraxtil
Це не відповідь для кожного. Як показано нижче в stackoverflow.com/a/37218484/4028977, це може бути багато причин, чому це відбувається. З деякими простими журналами ви можете дізнатись без догадки. - Rob


Відповіді:


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'] або ['*'] для швидкого тесту але не використовуйте ['*'] для виробництва.


396
2018-02-28 05:43



Вау - це нас набридло важко. Це дійсно засмагає, що це налаштування поховано в документах. Наш виробничий сайт не буде працювати з DEBUG = False. Дякую, що вказали на це !!! - shreddd
Докладніше про проблеми безпеки, які вносять цей параметр: Практичні атаки заголовка HTTP-хосту. Ви обов'язково переконаєте вас не використовувати ['*'] у виробництві. - gertvdijk
бл. Прикро, що вони навіть не прикріплюють його як значення за замовчуванням в settings.py, можливо, з розширеним коментарем ... - hwjp
Якщо ваш файл налаштувань поставляється з django 1.5 установки, конфігурація ALLOWED_HOSTS буде там, з пояснювальним коментарем (наприклад, що хотів @hwjp). Якщо ви додаєте власний запис ALLOWED_HOSTS (і має існуючий, дубльований ALLOWED_HOSTS), то ви отримаєте 500 помилок. - binithb
Іноді мені цікаво, чому Джанго стає все більш і більш відсталим! Звичайно, ці хлопці набагато кращі програмісти, ніж я, але я насправді не розумію рішення про "виправлення" вразливостей на рівні додатків, коли реальним і чистим кроком буде правильне налаштування сервера. Те саме стосується "кешування шаблонів" та "постійних з'єднань" ... Безглуздий код, який ніколи не буде використовуватися на серйозному веб-сайті; все ще представлений як святий Грааль програмування! Може бути, тільки я, я помилявся раніше! - StefanNch


Я знаю, що це пізно, але я опинився тут з пошуком моєї помилки з 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',
        },
    }
}

27
2018-05-13 20:02



Це має бути прийнята відповідь. Набагато корисніше просто попросити саму систему, що не працює після використання налаштувань виробництва, замість того, щоб намагатися вгадати. - Stefan Dragnev
На жаль краща відповідь !!! Дуже дякую! - Jorrick Sleijster
Дійсно, це не те, що б блукати навколо в темряві. Просто подивіться на повідомлення про помилку, яке ви зазвичай бачите, використовуючи цей метод. У моєму випадку мені не вистачало іншої настройки в моїх налаштуваннях.py, які шукала моя програма. Все, що мені було потрібно, було журналом, щоб відстежити це. Одна важлива примітка: я додав / path / to / my / django / перед mysite.log, як показано на прикладі docs: docs.djangoproject.com/uk/1.10/topics/logging/#examples - Rob
Я провів години, шукаючи рішення, не використовую. відповідно до цієї відповіді, просто використовуйте ведення журналу, і ви повинні мати свою проблему, це найкраща відповідь. Дякую OP! - Stack


У моєму випадку, читання документів сторонніх додатків належним чином врятувало мене.

Винуватця? django_compressor

я мав

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

DEBUG = True завжди давав мені 500. Щоб виправити це, мені потрібна лінія в моїх налаштуваннях, щоб отримати її

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

22
2018-06-22 19:03



Спасибі, що саме тому вона не спрацювала для мене, але чи не відключає ця лінія django_compressor від своєї роботи? - Fanckush
@Фанкуш ні. Ніякої шкоди не бере участь. django-compressor.readthedocs.io/en/latest/settings/... Компресор все одно буде виконувати свою роботу чудово! Просто стискайте всю вашу статику (наприклад, css), щоб це налаштування було марним, оскільки ваші активи вже стиснуті - Rexford


Правильно, у Django 1.5, якщо DEBUG = False, налаштуйте ALLOWED_HOSTS, додавши домени без номера порту. приклад:

ALLOWED_HOSTS = ['localhost']

12
2018-05-17 15:35



З будь-якої причини, використання "localhost" не працювало для мене. Мені доводилося використовувати IP '127.0.0.1' замість нього. Я також зміг використати "*", якщо ви вибиваєтеся і просто хочете, щоб він працював. Проте я б не радив це робити у виробництві. OSX працює Django 1.4.20 - BlakePetersen


Ви також повинні перевірити свої URL-адреси в усіх місцях. Коли DEBUG встановлено на False, всі URL-адреси без зворотного зв'язку / трактуються як помилка, на відміну від того, коли у вас є DEBUG = True, в якому випадку додасться Джанго / скрізь це відсутнє. Таким чином, коротше, переконайтеся, що всі посилання закінчуються косою комою повсюдно.


9
2018-06-18 08:23



просто використовуйте зворотний і url тег, і ви повинні бути в порядку - maazza
налаштування DEBUG=False Можна також представити помилки імпорту: stackoverflow.com/questions/25676453/... - ecoe
навіть посилання на js та css активи? - amchugh89
@ amchugh89: ні, просто "django" URL-адреси - webzy
Моє питання полягає в тому, що whitenoise не вдалося знайти деякий образ і кидав ValueError. Я також не міг її знайти, але не знав, як сказати білосніжному, щоб не шукати його. Таким чином, я повернув білосніжну, використовую статичну службу django, і тепер я можу запустити налагодження = False в продукті. Очевидно, не ідеал :( - amchugh89


У мене є весела історія для всіх. Після досягнення цієї сторінки я сказав: "Єврика! Я врятований, це повинно бути моєю проблемою". Тому я вставив потрібний ALLOWED_HOSTS перелічити в налаштуваннях.py і ... нічого. Той же старий 500 помилок. І ні, це не через відсутність файлу 404.html.

Так що протягом 2 днів я займався дикими теоріями, наприклад, що це мав щось відношення до служби статичних файлів (розумію, що я ноок, а ноуфи не знають, що вони роблять).

Так що це було? Зараз пан Модератор прийшов до корисної поради. У той час як моя розробка Django - це версію 1.5. Щось, моя версія сервісного сервера - 1.5. Щось + 1 ... або, можливо, плюс 2. Що завгодно. І так після того, як я додав ALLOWED_HOSTS до настільної версії settings.py, в якому бракує запиту hwjp --- «значення за замовчуванням в settings.py, можливо, з пояснювальним коментарем» --- я зробив те ж саме на виробничому сервері з відповідним доменом для нього.

Але я не помітив, що на виробничому сервері з пізнішою версією Django WAS була значення за замовчуванням в settings.py з пояснювальним коментарем. Це було значно нижче, де я зробив свій вхід, не дивлячись на монітор. І, звичайно, список був порожнім. Звідси моя марна трата часу.


6
2017-10-09 09:55



я мав точно той же веселий малюнок!, крім того, що це стало веселим тільки після того, як я знайшов це, спасибі. раніше це просто було розчаруванням - binithb
Щось, що допомагає у всьому цьому, - це використовувати local_settings.py для кожного середовища, а потім імпортувати його в settings.py. - nicorellius
що я люблю робити, є налаштування / каталог замість налаштувань.py У цьому каталозі ви можете мати окремі файли .py для різних середовищ і base.py для загальних налаштувань. Залежні від виробництва параметри можуть починатися, імпортуючи * з основних налаштувань і просто перевизначаючи все, що їм необхідно переопределити. Також обов'язково в цьому.py потрібно перетворити ці параметри / каталог в дійсний модуль, спочатку можна імпортувати з base.py, а потім спробувати імпортувати з local.py (який може існувати лише локально). це означає, що вам не потрібно вказувати локальні параметри вручну - mephisto


Нещодавно я зіткнувся з цією ж проблемою в 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.


6
2018-02-10 19:16





Я зіткнувся з тією ж проблемою, коли зробив це DEBUG = FALSE. Ось зведене рішення, розсіяне у відповідях вище та інших публікаціях.

За замовчуванням у налаштуваннях.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

Я також розмістив докладне рішення на моєму блог які ви, можливо, захочете звернутися.


5
2018-02-02 06:58





За що це коштує - я отримав 500 з DEBUG = False лише на деяких сторінках. Відстеження винятку з pdb виявило відсутність активу (я підозрюю, що {% static ... %} Тег шаблону був винуватцем 500.


5
2018-01-05 18:36



Це було також моє питання, основний шаблон, на якому посилається користувацька сторінка 404, використовував статичний тег, але не містив {% load static%} у верхній частині сторінки. Я не помітив це в іншому місці, тому що мої інші шаблони мали цю лінію, але має сенс вносити його в базу так чи інакше, оскільки воно стосується статичних файлів у всьому місці. - krischan
Таке рішення тут - я використовував static щоб включити файл CSS, який не існує. - Phil Gyford


Доповнення основної відповіді
Прикро, щоб змінити глобальні константи 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:
    ...

5
2018-05-06 23:44





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 служити на даний момент


4
2017-11-23 18:17



У мене була така сама проблема з білою нізкістю. python manage.py collectstatic фіксується - Eugene Pakhomov
@ amchungh89 ви заощаджуєте життя! Забавно, щоб вказати на це. - Deepak Sharma