#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. (Я забыл добавить промежуточное программное обеспечение.)