Django на Heroku — отсутствует файл staticfiles manifest.json

#python #django #heroku #django-staticfiles #whitenoise

#python #django #heroku #django-staticfiles #белый шум

Вопрос:

Я пытаюсь запустить Django на Heroku. Я посмотрел вокруг Stack Overflow, я пробовал разные вещи, но я не могу понять это. Это похоже на все вопросы, связанные с проблемой staticfiles в Django, к сожалению, я не знаю, в чем проблема. Мой проект работает просто отлично DEBUG = True , но когда я меняю его на False, я получаю следующую трассировку:

2020-11-09T13:13:42.801384 00:00 app[web.1]: Missing staticfiles manifest entry for 'order/css/open-iconic-bootstrap.min.css'

Это происходит во всех моих приложениях, которым требуются staticfiles. Я пытался найти manifest.json, но он не существует. Поэтому я думаю, что это проблема.

Вот мои соответствующие настройки:

 MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
#more ...
]
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') 
STATIC_URL = '/static/'
STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'

django_heroku.settings(locals())
  

Спасибо, что изучили это!

Комментарии:

1. Можете ли вы подтвердить, что вы уже пробовали с heroku run python manage.py collectstatic ? У вас включен DISABLE_COLLECTSTATIC в настройках? Если да, его отключение может дать вам представление о том, что происходит неправильно. Возможно, также установите DEBUG_COLLECTSTATIC=1 .

2.@keoma вот моя конфигурация: DEBUG_COLLECTSTATIC: 1 DISABLE_COLLECTSTATIC: 0 . Я попытался переключить DISABLE_COLLECTSTATIC, но не увидел никакой разницы. Когда я запускаю collectstatic на heroku, я получаю It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path доступ ко всем своим файлам, что приводит к 0 static files copied to /app/staticfiles, 742 unmodified, 2140 post-processed

3. может быть разница между DISABLE_COLLECTSTATIC=0 и переменной, которая не установлена. Можете ли вы попробовать с heroku config:unset DISABLE_COLLECTSTATIC помощью? Убедитесь, что скрипт сборки запущен, а не просто перезапускает скрипт.

4. @keoma Это сработало! Можете ли вы опубликовать его в качестве ответа?

Ответ №1:

@keome в комментариях уже дал вам первые шаги по отладке этой проблемы, поэтому я не буду повторять это здесь.

Несмотря на проблемы, которые они подняли (которые следует рассмотреть в первую очередь), я думаю, что ключевая проблема заключается в том, что ваша конфигурация whitenoise не настроена для создания манифеста. Вы, вероятно, хотите:

 # Serve compressed and manifested static files
STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"
  

Причина, по которой ваша текущая конфигурация будет работать, DEBUG=1 заключается в том, что в режиме отладки django вернется к обслуживанию самих статических файлов (ни безопасных, ни эффективных).

Во-вторых, убедитесь collectstatic , что вы работаете с той же конфигурацией хранилища, что и на сервере — я не вижу, какие у вас есть файлы настроек, но похоже, что вы собрали статику без стратегии манифеста, но вы пытаетесь использовать ее с помощью стратегии манифеста (и, следовательно, django смущен, почемуманифеста нет).

Кстати, whitenoise по умолчанию создает staticfiles.json файл, а не manifest.json файл, и он подается как статический файл. Итак, если ваш STATIC_URL = "/static/" , то вы можете найти манифест по адресу <your-domain>/static/staticfiles.json .

Редактировать — уточнение

Причина, по которой манифест staticfiles фактически не вызывается, manifest.json заключается в том, что это противоречит обычному имени файла, который manifest.json используется как часть прогрессивного веб-приложения (спецификация здесь), что отчасти похоже (в том смысле, что оно может служить инструкцией для браузера о том, где найти определенные файлы), но нето же самое.

Комментарии:

1. У меня есть строка STATICFILES_STORAGE выше, но я получаю все те же симптомы. Я могу воспроизвести локально, установив DEBUG=False и выполнив collectstatic . Я вижу все файлы в staticfiles, но Django их не обслуживает (400 ошибок). Идеи о том, как отлаживать?

2. Я неправильно установил whitenoise. (Я забыл добавить промежуточное программное обеспечение.)