Команда "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анализирует все файлы, чтобы найти ссылки на другие активы, чтобы он мог предварительно сгенерировать хэши для всех из них, чтобы добавить их в манифест.

Есть два способа решить эту проблему:

  1. Переключиться на использование CompressedStaticFilesStorage(нет Manifest), чтобы хэши файлов не преобразовывались.

  2. Определите все отсутствующие файлы, о которых сообщается во время 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',
# ...]

Источник - http://whitenoise.evans.io/en/stable/django.html

У меня была похожая проблема, но с изюминкой.

Я развернул на 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,

Теперь приложение работает нормально

Есть два варианта:

  1. Чтобы добавить правильную ссылку, которая находится в css
  2. Удалив ссылку на файл, которого нет в 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')
Другие вопросы по тегам