ValueError в / Отсутствует запись манифеста статических файлов для ''

Я пытаюсь перейти с Django 1.9.7 на Django 1.11.5. У меня есть три разных приложения django, и они почти одинаковы в отношении пакетов и настроек. Я развернул все три из них на веб-сервере, и два приложения работают без каких-либо проблем, но третье вызывает головную боль - я постоянно получаю эту ошибку:

ValueError at / Missing staticfiles manifest entry for ''

Вот наиболее важные настройки из settings.py:

# -*- coding: utf-8 -*-
from settings import * 

SECRET_KEY = '***'

SITE_ID = 3

ALLOWED_HOSTS = [
    'localhost', 
    '127.0.0.1',
    '.example.com',
    '.example.com.',

    ]

INSTALLED_APPS += (
    'storages',
    'example',
    'example2',
    'el_pagination',
    'debug_toolbar',
)

ROOT_URLCONF = 'example.urls'

WSGI_APPLICATION = 'example.wsgi.application'

DEFAULT_FROM_EMAIL = 'web@example.com'

MANAGERS = ADMINS

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        'DEFAULT_MIDDLEWARE_ALIAS': 'default',
        'DEFAULT_MIDDLEWARE_SECONDS': '300',
        'DEFAULT_MIDDLEWARE_KEY_PREFIX': '',
    }
}

PASSWORD_HASHERS = (
    'django.contrib.auth.hashers.SHA1PasswordHasher',
)

#AWS_HEADERS = {  # see http://developer.yahoo.com/performance/rules.html#expires
#       'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT',
#        'Cache-Control': 'max-age=94608000',
#S    }

# AMAZON S3 & CLOUDFRONT SERVING MEDIA FILES
AWS_S3_HOST = 's3.eu-central-1.amazonaws.com'
AWS_STORAGE_BUCKET_NAME = '***'
AWS_CLOUDFRONT_DOMAIN = '***.cloudfront.net'
AWS_ACCESS_KEY_ID = "***"
AWS_SECRET_ACCESS_KEY = "***"
MEDIAFILES_LOCATION = 'example/media'
MEDIA_ROOT = '/%s/' % MEDIAFILES_LOCATION
MEDIA_URL = '//%s/%s/' % (AWS_CLOUDFRONT_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = 'example.custom_storages.MediaStorage'

# WHITENOISE SERVING STATIC FILES
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
STATIC_ROOT = os.path.join(BASE_DIR, '***/static/example') 
STATIC_URL = '/static/'

Я не знаю, почему я получаю эту ошибку, потому что я ничего не сделал (при развертывании) по сравнению с двумя другими приложениями, которые работают регулярно. Настройки практически одинаковы! Я также попытался очистить файлы.css, чтобы исключить вероятность того, что файлы css где-то указывают на файлы, которые не существуют, но это не помогло. Я обновил все пакеты, которые используют мои сайты. Это приложение работает нормально под Django 1.9.7, но я не могу заставить его работать под 1.11.5.

РЕДАКТИРОВАТЬ - КАК Я ЭТО исправил?

Благодаря ответу @evansd мне удалось найти проблему! В одном из моих шаблонов у меня был этот код, который все испортил:

{% for num in numbers  %}
<li>
   <img src="{% static ''%}img/header/{{num}}.jpg" alt="image {{num}}"/>
</li>
{% endfor %}

и я изменил это на:

{% for num in numbers  %}
<li>
   <img src="{% static 'img/header/'|addstr:num|addstr:'.jpg' %}" alt="image {{num}}">
</li>
{% endfor %}

После этого исправления все работает хорошо! Для пользовательского тега шаблона addstr посмотрите этот ответ.

3 ответа

Решение

Проблема в том, что где-то в ваших шаблонах вы ссылаетесь на статический файл, который не существует. В частности, вы передаете пустую строку static, Возможно, у вас есть такая строка {% static some_variable %} где some_variable не определено?

В Django 1.11 поведение изменилось так, что ошибки появляются на отсутствующих файлах. См.: https://docs.djangoproject.com/en/1.11/ref/contrib/staticfiles/

Если вы исправите эту ссылку, то все должно работать.

Не работает python manage.py collectstatic) может быть вашей проблемой.

Решение:

Вы можете обойти эту проблему и улучшить код, переместив static() вызов из поля модели и изменение значения по умолчанию на строку "pledges/images/no-profile-photo.png", Это должно выглядеть так:

avatar_url = models.URLField(default='pledges/images/no-profile-photo.png')

Когда вы получаете доступ avatar_url, используйте либо

  1. (опция внешнего интерфейса / шаблонов Django) {% static profile_instance.avatar_url %}, где profile_instance является контекстной переменной, ссылающейся на объект Profile.

  2. (опция backend / Python) использовать static(profile_instance.avatar_url),

Объяснение:

Используя результат static() для значения по умолчанию приложение помещает URL-адрес в базу данных, которая включает STATIC_URL префикс - это похоже на жесткое кодирование, потому что данные не изменятся, когда settings.py делает. В целом, вы не должны хранить результаты static() в базе вообще.

Если вы убедитесь, что вы используете {% static %} тег или static() функционировать каждый раз, когда вы получаете доступ avatar_url для отображения на веб-интерфейсе, STATIC_URL будет по-прежнему добавляться в зависимости от конфигурации вашей среды во время выполнения.

Этот SO поток имеет много хорошего контента на staticfiles

Почему происходит ошибка:

Похоже, у вас есть круговая зависимость:

  1. collectstatic нужно запустить, чтобы создать manifest.json

  2. Ваше приложение должно быть загружено для запуска manage.py команды, которые вызывает static()

  3. static() полагается на запись в manifest.json Разрешить.

Исходный ответ здесь. Модель Django: ValueError: отсутствует запись манифеста статических файлов для "file_name.ext"

В моем случае я запускал django внутри докера, но не от имени пользователя root. Снаружи я бежалpython manage.py collectstatic. Это работаетmanage.pyот имени пользователя root, что делает файлы недоступными для самого django.

Решение. Запустите команду от имени того же пользователя, у которого вы запускаете django, в своем докере, или выполните командуchownкоманда для вашегоstaticкаталог.

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