Ошибка сервера Django Whitenoise 500 в режиме без отладки

Я использую Django в моей локальной машине. Чтобы обслуживать статические файлы, я использовал WhiteNoise вместе с ним. когда DEBUG = True все статические файлы корректно обслуживаются. Но когда я изменился DEBUG = False и установить ALLOWED_HOSTS = ['*'] Я получаю 500 ошибок сервера. Однако администратор сайта загружается без каких-либо ошибок. Также, когда я закомментирую STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' Я не получаю 500 ошибок.

Я следовал документации, приведенной в http://whitenoise.evans.io/en/stable/django.html чтобы подключить белый шум. Я не внес никаких изменений в wsgi.py файл. Я побежал python manage.py collecststatic и он работал без каких-либо ошибок.

settings.py дается ниже:

import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

SECRET_KEY = 'fdft&b(xb*!qq3ghjkjhg6789ih8ik!w10$0uscxcpqpmz'
DEBUG = False

ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
'whitenoise.runserver_nostatic', #Disable Djangos static file server during DEVELOPMENT
'gep_app.apps.GepAppConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'gep_project.urls'

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
},
]

WSGI_APPLICATION = 'gep_project.wsgi.application'


DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': '*************',
    'USER': '*****',
    'PASSWORD': '********',
    'HOST': '*****',
    'PORT': '5432',
}
}

 # User model
 AUTH_USER_MODEL = 'gep_app.User'

 # Login URL
 LOGIN_URL = 'login'

 # Login redirect
 LOGIN_REDIRECT_URL = 'home'

 # Logout redirect
 LOGOUT_REDIRECT_URL = 'login'

 #Authentication backends
 AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
)

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

3 ответа

У меня была похожая ошибка, и в журналах было указано ValueError: Missing staticfiles manifest entry for...

Изменение STATICFILES_STORAGE в settings.py из:
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
чтобы:
STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
как описано в этом разделе белых документов, исправил это для меня.

Также вы, вероятно, захотите изменить свой SECRET_KEY теперь, когда он открыт для общего доступа.

Изменение для быстрого решения:

      STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

к:

      STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'

Но! Он будет генерировать статические файлы без уникальных ключей блоков для правильного обновления в браузере клиента (например, style.343a1fa2da70.css), и клиент не увидит изменений без обновления кеша сайта. WhiteNoise добавляет только тонкую оболочку вокруг хранилища Django, чтобы добавить поддержку сжатия, и, поскольку код сжатия очень прост, он обычно не вызывает проблем. Итак, вам нужно

  1. Возврат STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
  2. Очистить папку staticfiles вручную
  3. Обновите статические ресурсы, py manage.py collectstatic --noinput
  4. Наслаждаться!

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

Причина, по которой вы получили внутреннюю ошибку сервера, заключается в том, что перед добавлением Whitenoise вы запустили его, который по умолчанию использовался; STATICFILES_STORAGE='django.contrib.staticfiles.storage.StaticFilesStorage'

Поэтому, чтобы сохранить настройку STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage', просто беги python manage.py collectstaticопять таки.

Документы Django здесь должны дать вам больше информации.

Другие вопросы по тегам