Команда "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>.
Команда статической коллекции запускается без инцидентов, когда я комментирую эту строку в моих настройках:
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
Что здесь происходит, и как я могу это исправить? Я уже пробовал очистить мою статическую папку вывода файлов. Он работает плавно, пока не начнет обработку одного конкретного файла.
Ответы
Ответ 1
Проблема заключается в том, что css/iconic/open-iconic-bootstrap.css
ссылается на файл open-iconic.eot
, который не существует в ожидаемом местоположении.
Когда вы запустите collectstatic
с помощью этого хранилища, Django попытается переписать все URL-адреса в ваших файлах CSS, чтобы они ссылались на файлы по их новым именам, например, css/iconic/open-iconic.8a7442ca6bed.eot
. Если он не может найти файл, он останавливается с этой ошибкой.
Ответ 2
У меня была эта же проблема и исправлена ее, удалив эту строку из моего файла настроек,
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
Я получил эту строку на странице документации Heroku...
Ответ 3
У меня была эта ошибка с отсутствием файла .css, когда все мои файлы .css существовали, потому что я доверял документации Heroku:
STATIC_ROOT = 'staticfiles'
над документацией WhiteNoise:
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Исправление тривиально, но до тех пор, пока Heroku не зафиксирует свои документы (я отправил отзыв), дайте убедиться, что решение, по крайней мере, появляется в SO.
Ответ 4
Проблема заключается в том, что использование
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
или
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage
использует статическое хранилище Django по-другому, чем при работе с сервером. См. Документы Django для некоторого объяснения: https://docs.djangoproject.com/en/1.11/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.ManifestStaticFilesStorage.manifest_strict
Я считаю, что ссылочный манифест создается, когда вы запускаете collectstatic, поэтому это должно временно исправлять эту проблему, но вы, вероятно, не хотите запускать collectstatic перед каждым тестовым запуском, если вы изменили какие-либо статические файлы. Другим решением было бы отключить этот параметр для ваших тестов и просто запустить его в процессе производства.
Ответ 5
Для меня исправить было просто добавление "статической" папки в верхний каталог (myapp/static сделал трюк). Если вы устанавливаете STATIC_URL, но не создали этот каталог, он будет вызывать ошибку, даже если вы не используете этот каталог для ваших статических файлов с whitenoise.
STATIC_URL = '/static/'
Ответ 6
У меня была похожая проблема, но с изюминкой.
Я развернул на pythonanywhere. Если я включаю отладку True, приложение работает нормально. Но если по очереди выполняется отладка False, приложение вылетает с ошибкой, в которой одной строкой является сводка
ValueError: Missing staticfiles manifest entry for 'favicons/favicon.ico'
Я изменил с STATIC_ROOT = 'staticfiles
на STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
staticfiles
каталог staticfiles
, затем повторно staticfiles
python manage.py collectstatic
.
Теперь приложение работает нормально
Ответ 7
Он работал у меня, комментируя whitenoise в settings.py в процессе производства.
#STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
#WHITENOISE_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Ответ 8
Я занимался этим вопросом весь день. Оказывается, проблема была в staticfiles
каталог staticfiles
не был зарегистрирован в git. Я создал фиктивный файл внутри этого каталога, проверил его, и все было хорошо. Я считаю, что это тоже упоминалось где-то в документации по Whitenoise.
Ответ 9
Обязательно проверьте все ваши настройки, относящиеся к статическим файлам, особенно убедитесь, что пути указывают на правильные места. Лично у меня был один из моих STATICFILES_DIRS
указывающий на неверный путь.
Ответ 10
Как и у всех остальных, у меня было уникальное решение этой проблемы... оказалось, что у меня был 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
работал нормально, и я не получил эту ошибку.
Ответ 11
Псевдоним whitenoise.django.GzipManifestStaticFilesStorage
теперь удален. Вместо этого вы должны использовать правильный путь импорта: whitenoise.storage.CompressedManifestStaticFilesStorage
.
Согласно документу здесь.