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
, используйте либо
(опция внешнего интерфейса / шаблонов Django)
{% static profile_instance.avatar_url %}
, гдеprofile_instance
является контекстной переменной, ссылающейся на объект Profile.(опция backend / Python) использовать
static(profile_instance.avatar_url)
,
Объяснение:
Используя результат static()
для значения по умолчанию приложение помещает URL-адрес в базу данных, которая включает STATIC_URL
префикс - это похоже на жесткое кодирование, потому что данные не изменятся, когда settings.py
делает. В целом, вы не должны хранить результаты static()
в базе вообще.
Если вы убедитесь, что вы используете {% static %}
тег или static()
функционировать каждый раз, когда вы получаете доступ avatar_url
для отображения на веб-интерфейсе, STATIC_URL
будет по-прежнему добавляться в зависимости от конфигурации вашей среды во время выполнения.
Этот SO поток имеет много хорошего контента на staticfiles
Почему происходит ошибка:
Похоже, у вас есть круговая зависимость:
collectstatic
нужно запустить, чтобы создатьmanifest.json
Ваше приложение должно быть загружено для запуска
manage.py
команды, которые вызываетstatic()
static()
полагается на запись вmanifest.json
Разрешить.
Исходный ответ здесь. Модель Django: ValueError: отсутствует запись манифеста статических файлов для "file_name.ext"
В моем случае я запускал django внутри докера, но не от имени пользователя root. Снаружи я бежалpython manage.py collectstatic
. Это работаетmanage.py
от имени пользователя root, что делает файлы недоступными для самого django.
Решение. Запустите команду от имени того же пользователя, у которого вы запускаете django, в своем докере, или выполните командуchown
команда для вашегоstatic
каталог.