Команда "collectstatic" завершается неудачно, если включен WhiteNoise
Я пытаюсь обслуживать статические файлы через WhiteNoise в соответствии с рекомендациями Heroku. Когда я бегу collectstatic
в моей среде разработки это происходит:
Post-processing 'css/iconic/open-iconic-bootstrap.css' failed!
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
utility.execute()
File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/core/management/__init__.py", line 377, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/core/management/base.py", line 288, in run_from_argv
self.execute(*args, **options.__dict__)
File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/core/management/base.py", line 338, in execute
output = self.handle(*args, **options)
File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/core/management/base.py", line 533, in handle
return self.handle_noargs(**options)
File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 168, in handle_noargs
collected = self.collect()
File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 120, in collect
raise processed
File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/storage.py", line 242, in post_process
content = pattern.sub(converter, content)
File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/storage.py", line 181, in converter
hashed_url = self.url(unquote(joined_result), force=True)
File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/storage.py", line 128, in url
hashed_name = self.stored_name(clean_name)
File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/storage.py", line 277, in stored_name
cache_name = self.clean_name(self.hashed_name(name))
File "/home/Pieter/.virtualenvs/radiant/lib/python3.4/site-packages/django/contrib/staticfiles/storage.py", line 91, in hashed_name
(clean_name, self))
ValueError: The file 'css/fonts/open-iconic.eot' could not be found with <whitenoise.django.GzipManifestStaticFilesStorage object at 0x7f57fc5b1550>.
Команда static collection работает без инцидентов, когда я закомментирую эту строку в моих настройках:
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
Что здесь не так и как мне это исправить? Я уже пытался очистить папку вывода статического файла. Он работает гладко, пока не начнет обрабатывать один конкретный файл.
16 ответов
Проблема здесь в том, что css/iconic/open-iconic-bootstrap.css
ссылается на файл, open-iconic.eot
, который не существует в ожидаемом месте.
Когда ты бежишь collectstatic
с этим бэкэндом хранилища Django пытается переписать все URL-адреса в ваших CSS-файлах, чтобы они ссылались на файлы своими новыми именами, например, css/iconic/open-iconic.8a7442ca6bed.eot
, Если он не может найти файл, он останавливается с этой ошибкой.
У меня была такая же проблема, и я исправил ее, удалив эту строку из моего файла настроек,
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
Я получил эту строку со страницы документации Heroku...
Я имел эту ошибку, утверждая, что отсутствовал файл.css, когда существовали все мои файлы.css, потому что я доверял документации Heroku:
STATIC_ROOT = 'staticfiles'
по документации WhiteNoise:
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Исправление тривиально, но пока Heroku не исправит свои документы (я отправил отзыв), давайте удостоверимся, что решение по крайней мере появляется в SO.
В более новых версиях whitenoise доступно только два класса хранения:
-
whitenoise.storage.CompressedManifestStaticFilesStorage
-
whitenoise.storage.CompressedStaticFilesStorage
Эта ошибка возникает при
CompressedManifestStaticFilesStorage
, в тех случаях, когда любой из ваших статических ресурсов ссылается на другие ресурсы, которые не могут быть найдены средством поиска статических файлов. Это потому, чтоHashedFilesMixin
анализирует все файлы, чтобы найти ссылки на другие активы, чтобы он мог предварительно сгенерировать хэши для всех из них, чтобы добавить их в манифест.
Есть два способа решить эту проблему:
Переключиться на использование
CompressedStaticFilesStorage
(нетManifest
), чтобы хэши файлов не преобразовывались.Определите все отсутствующие файлы, о которых сообщается во время collectstatic, и либо убедитесь, что они присутствуют в ваших собранных каталогах, либо удалите ссылки на них в ваших статических файлах.
Проблема в том, что с помощью
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
или же
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage
использует статическое хранилище файлов Django не так, как runserver. См. Django Docs для некоторых объяснений: https://docs.djangoproject.com/en/1.11/ref/contrib/staticfiles/
Я полагаю, что указанный манифест создается при запуске collectstatic, поэтому это должно временно решить эту проблему, но вы, вероятно, не захотите запускать collectstatic перед каждым тестовым запуском, если вы изменили какие-либо статические файлы. Другим решением было бы отключить этот параметр для ваших тестов и просто запустить его в работе.
В разработке Django's runserver
автоматически берет на себя обработку статических файлов.
В большинстве случаев это нормально, однако это означает, что некоторые из улучшений, которые WhiteNoise вносит в обработку статических файлов, не будут доступны в разработке, и это открывает возможность различий в поведении между средами разработки и производственной средой. По этой причине рекомендуется также использовать WhiteNoise в разработке.
Вы можете отключить статическую обработку файлов в Django и позволить WhiteNoise взять на себя управление, просто передав --nostatic
к команде runserver, но вам нужно не забывать добавлять эту опцию каждый раз, когда вы вызываете runserver. Более простой способ - отредактировать файл settings.py и добавитьwhitenoise.runserver_nostatic
к вершине вашего INSTALLED_APPS
список:
INSTALLED_APPS = [
'whitenoise.runserver_nostatic',
'django.contrib.staticfiles',
# ...]
У меня была похожая проблема, но с изюминкой.
Я развернул на pythonanywhere. Если я включаю отладку True, приложение работает нормально. Но если по очереди происходит отладка False, приложение вылетает с ошибкой, в которой одной строкой является сводка
ValueError: Missing staticfiles manifest entry for 'favicons/favicon.ico'
Я изменился с STATIC_ROOT = 'staticfiles
в STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
удаленный staticfiles
каталог, затем повторите python manage.py collectstatic
,
Теперь приложение работает нормально
Есть два варианта:
- Чтобы добавить правильную ссылку, которая находится в css
- Удалив ссылку на файл, которого нет в css
Для меня исправлением было просто добавить "статическую" папку в верхний каталог (myapp/static сделал свое дело). Если вы устанавливаете STATIC_URL, но этот каталог еще не создан, он выдаст ошибку, даже если вы не используете этот каталог для статических файлов с whitenoise.
STATIC_URL = '/static/'
Как и у всех, у меня было уникальное решение этой проблемы... оказывается, у меня был url()
в моем styles.css
файл с неправильным синтаксисом.
Однажды я изменился:
background-image: url( '../images/futura_front_blank_medium.jpg' );
в
background-image: url('../images/futura_front_blank_medium.jpg');
(обратите внимание на небольшую разницу - я удалил пробелы по обе стороны строки)
затем python manage.py collectstatic
работал нормально, и я не получил эту ошибку.
Обязательно проверьте все ваши настройки, относящиеся к статическим файлам, особенно убедитесь, что пути указывают на правильные места. У меня лично был один из моих STATICFILES_DIRS
указывая на неправильный путь.
Я не сталкивался с этой проблемой, пока не создал образ докера моего проекта в Linux. Я обычно строю на macOS.
Я считаю, что существует разница в чувствительности к регистру по умолчанию между наиболее распространенными файловыми системами, используемыми этими двумя операционными системами.
Я решил эту проблему, переименовав файлы, связанные с моим CSS, во все строчные буквы.
Ранее:
url('/static/Some-File.png')
Сейчас:
url('/static/some-file.png')
whitenoise.django.GzipManifestStaticFilesStorage
псевдоним был удален. Вместо этого вы должны использовать правильный путь импорта: whitenoise.storage.CompressedManifestStaticFilesStorage
,
Согласно документу здесь.
Я занимался этим вопросом весь день. Оказывается, проблема была в staticfiles
каталог не был зарегистрирован в Git. Я создал фиктивный файл внутри этого каталога, проверил его, и все было хорошо. Я полагаю, что это также упоминалось где-то в документации по Whitenoise.
В моем случае было другое решение. В конфигурации Heroku у меня была настройка:
DISABLE_COLLECTSTATIC=0
который должен позволить Heroku автоматически собирать статические помехи, нажимая на мастер heroku, но этого не произошло!.
Я удалил этот параметр на
Heroku > my_app > settings > config vars
и после этого Heroku автоматически собирает статические файлы, и проблема исчезает.
Это сработало для меня, закомментировав белый шум в settings.py в производстве.
#STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
#WHITENOISE_ROOT = os.path.join(BASE_DIR, 'staticfiles')