Установка DEBUG = Ложь вызывает 500 Ошибка

264

Как только я изменю 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-^^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 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',
)
  • 0
    Да, я добавил файл 403 и 404 500 html в мой каталог шаблонов
  • 0
    Есть ли у вас файлы 500.html и 404.html и 403.html? Я думаю, что помню проблему с развернутым проектом, который не имел этих файлов в корне моего каталога шаблонов.
Показать ещё 5 комментариев
Теги:
settings
django-1.5

22 ответа

390
Лучший ответ

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

  • 28
    Ух ты - нам это тяжело. Это действительно отстой, что этот параметр похоронен в документах. Наш производственный сайт не будет работать с DEBUG = False. Спасибо, что указали на это !!!
  • 4
    Подробнее о проблемах безопасности, связанных с этим параметром: Практические атаки на заголовки HTTP Host . Определенно убедит вас не использовать ['*'] в производстве.
Показать ещё 11 комментариев
17

В моем случае, чтение документов сторонних приложений правильно спасло меня.

Преступник? django_compressor

У меня был

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

DEBUG = True всегда давал мне 500. Чтобы исправить это, мне понадобилась строка в моих настройках, чтобы запустить ее

COMPRESS_ENABLED = os.environ.get('COMPRESS_ENABLED', False)
  • 0
    Спасибо, по этой причине это не сработало для меня, но разве эта строка не мешает django_compressor выполнять свою работу?
  • 1
    @Fanckush Нет. Никакого вреда не происходит. django-compressor.readthedocs.io/en/latest/settings/… Компрессор все равно отлично справится со своей работой! Просто сожмите всю свою статику (например, css), чтобы настройки были бесполезны, поскольку ваши ресурсы уже сжаты
12

Я знаю, что это поздно, но я оказался здесь с поиском моей ошибки 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',
        },
    }
}
  • 11
    Это должен быть принятый ответ. Гораздо полезнее просто спросить саму структуру, что не так после использования производственных настроек, вместо того, чтобы пытаться угадать.
  • 2
    Безусловно лучший ответ !!! Спасибо вам большое!
Показать ещё 3 комментария
12

Правильно, в Django 1.5, если DEBUG = False, настройте ALLOWED_HOSTS, добавив домены без номера порта. Пример:

ALLOWED_HOSTS = ['localhost']
  • 0
    По какой-то причине использование «localhost» не работает для меня. Вместо этого мне пришлось использовать IP-адрес «127.0.0.1». Я также мог использовать «*», если вы волнуетесь и просто хотите, чтобы это сработало. Однако я бы не советовал делать это на производстве. OSX работает под управлением Django 1.4.20
9

Вы также должны проверять свои URL-адреса повсеместно. Если для параметра DEBUG установлено значение False, все URL-адреса без привязки / рассматриваются как ошибка, в отличие от того, когда у вас есть DEBUG = True, и в этом случае Django будет добавлять / везде, где он отсутствует. Итак, короче говоря, убедитесь, что все ссылки заканчиваются косой чертой. ВЕРНУТЬСЯ.

  • 3
    просто используйте reverse и url tag, и все будет хорошо
  • 0
    установка DEBUG=False может отображать ошибки импорта: stackoverflow.com/questions/25676453/…
Показать ещё 3 комментария
6

У меня есть веселая история для всех. Достигнув этой страницы, я сказал: "Эврика! Я спасен. Это ДОЛЖНО быть моей проблемой". Поэтому я вставил требуемый 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 с пояснительным комментарием. Это было значительно ниже, где я сделал свой вход, вне поля зрения на мониторе. И, конечно, список был пуст. Отсюда моя трата времени.

  • 1
    у меня был точно такой же веселый шаблон!, за исключением того, что он стал веселым только после того, как я нашел это, спасибо. до этого это было просто разочарование
  • 0
    Что-то, что помогает во всем этом, состоит в том, чтобы использовать local_settings.py для каждой среды, а затем импортировать его в settings.py .
Показать ещё 1 комментарий
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

Я также разместил подробное решение в своем блоге, которое вы можете захотеть сослаться.

4

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
    У меня была такая же проблема с белым шумом. python manage.py collectstatic исправил это.
  • 1
    @ amchungh89 ты спасатель жизни! Спасибо за указание на это.
4

Для чего это стоит - я получал 500 с DEBUG = False только на некоторых страницах. Отслеживание исключения с pdb выявило недостающий ресурс (я подозреваю, что тег шаблона {% static ... %} был виновником 500.

  • 1
    Это также было моей проблемой: базовый шаблон, на который ссылалась пользовательская страница 404, использовал статический тег, но не включал {% load static%} вверху. Я не заметил этого в другом месте, потому что в других моих шаблонах была эта строка, но все равно имеет смысл поместить ее в базу, так как она повсюду относится к статическим файлам.
  • 2
    То же решение здесь - я использовал static для включения CSS-файла, который не существует.
2

Я знаю, что это супер старый вопрос, но, возможно, я мог бы помочь кому-то другому. Если после установки DEBUG = False у вас есть ошибка 500, вы всегда можете запустить run.py в командной строке, чтобы увидеть какие-либо ошибки, которые не будут отображаться в каких-либо журналах веб-ошибок.

2

Дополнение основного ответа
Это раздражает, чтобы изменить настройки 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",]
1

Я искал и тестировал больше об этой проблеме, и я понял, что статические файлы directcotiries, указанные в settings.py, могут быть причиной этого, поэтому кулак, нам нужно запустить эту команду

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')
1

У меня подобная проблема, в моем случае это вызвано тем, что в теге body есть комментарий script.

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

Я думаю, что это могут быть настройки 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;
}
  • 0
    Мой файл настроек gunicorn выглядит следующим образом: #! / bin / bash cd / var / web / delicms_env / deli_cms / source ../bin/activate exec gunicorn --workers = 3 deli_cms.wsgi: application
  • 0
    Теперь моя проблема решена, я использовал скрипт gunicorn_django, и он давал мне устаревшие сообщения. Я все еще не уверен, почему он работал локально, не изменил мой конфиг nginx, просто изменил старый скрипт, чтобы он использовал gunicorn и использовал вместо него модуль wsgi: application, и он снова работает. Gunicorn и раньше выкладывал сообщения об устаревании, но ничего конкретного для моей проблемы.
0

Я нашел еще одну причину ошибки 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.

0

Я столкнулся с этой проблемой. Оказывается, я включал в шаблон, используя тег static template, файл, который больше не существует. Взгляд в журналах показал мне проблему.

Я думаю, это всего лишь одна из многих возможных причин такого рода ошибок.

Мораль истории: всегда регистрировать ошибки и всегда проверять журналы.

0

У меня было одно представление, которое запустило ошибку 500 в debug = false, но работало в debug = true. Для тех, кто получает такие вещи и "Разрешенные хосты", это не проблема, я исправил свой взгляд, обновив статический тег шаблона, который указывал на неправильное местоположение.

Итак, я бы предложил просто проверять ссылки и теги на воздухонепроницаемость в любых используемых шаблонах, возможно, некоторые вещи проскальзывают через сеть в отладке, но дают ошибки в производстве.

0

Немного поздно для вечеринки, и, конечно же, может существовать легион проблем, но у меня была аналогичная проблема, и оказалось, что у меня есть {%%} специальные символы внутри моего комментария html...

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

0

Это старое, и моя проблема закончилась тем, что связана с проблемой, но не для OP, но мое решение для всех, кто пробовал это, бесполезно.

У меня была настройка в модифицированной версии Django для минимизации CSS и JS файлов, которые выполнялись только тогда, когда DEBUG был выключен. Мой сервер не установил CSS minifier и выбросил ошибку. Если вы используете Django-Mako-Plus, это может быть вашей проблемой.

0

Я знаю, что это старый вопрос, но у меня также была ошибка 500, когда DEBUG = False. Через несколько часов я понял, что забыл закончить некоторые ссылки в моем base.html с завершающим косой чертой.

  • 0
    даже CSS и JS вещи?
-4

Если вы хотите разрешить все хосты. Используйте ALLOWED_HOSTS = ['*',] вместо ALLOWED_HOSTS = ['*']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню