Amazon Elastic Beanstalk не поддерживает статические файлы django
Я пытаюсь выложить простое приложение django на эластичный бобовый стебель. Я думал, что у меня были статические части приложения, которые были разработаны, поскольку он работает с герокой и на сервере, который был настроен вручную. В отладке я даже проверял, что статические файлы в статическом каталоге выталкивали, чтобы попытаться упростить ситуацию. Отображение кажется очень странным в том, что он, похоже, не следует за STATIC_ROOT.
Мои соответствующие конфиги:
settings.py
PROJECT_ROOT = os.path.abspath(os.path.dirname(__name__))
STATIC_ROOT = os.path.join(PROJECT_ROOT,'static/')
STATIC_URL = '/static/'
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
urls.py
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
ЖУРНАЛЫ:
[Wed Dec 26 15:39:04 2012] [error] [client 10.29.203.20] File does not exist: /opt/python/current/app/css, referer 10.29.203.20 - -
[26/Dec/2012:15:39:04 +0000] "GET /static/css/styles.css HTTP/1.1" 404 329 "http://" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11"
Ответы
Ответ 1
Вы нашли решение еще? просто что бы ты знал. Сегодня я столкнулся с той же проблемой, и понял, что забыл эту опцию в файле .ebextensions/.config. убедитесь, что у вас тоже есть.
option_settings:
- namespace: aws:elasticbeanstalk:container:python:staticfiles
option_name: /static/
value: static/
Ответ 2
Чтобы поддерживать несколько приложений и делать это, вам нужно запустить collectstatic
Settings.py
STATIC_ROOT = os.path.join(BASE_DIR, "static")
Убедитесь, что в корневой папке есть папка с именем static.
В вашем конфигурационном файле ebs, например. (02_python.config или аналогичный)
option_settings:
...
"aws:elasticbeanstalk:container:python:staticfiles":
/static/: "static/"
Затем перед загрузкой в ebs запустите python manage.py collectstatic
Это собирает все статические файлы в одной папке, о которой вы уже указали в своей конфигурации.
Затем вы можете запустить eb deploy
, как обычно,
Опционально, если вы не хотите дважды фиксировать статические файлы в своем источнике управления и хотите, чтобы сервер сделал это, чтобы добавить это в свою конфигурацию
container_commands:
01_collectstatic:
command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"
Итак, ваш файл должен выглядеть примерно так:
container_commands:
01_collectstatic:
command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"
option_settings:
"aws:elasticbeanstalk:container:python":
WSGIPath: app/wsgi.py
"aws:elasticbeanstalk:container:python:staticfiles":
/static/: "static/"
При запуске eb deploy
будет запущен сбор статических данных,
Ответ 3
Для меня проблема заключалась в том, что
STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'static')
Вместо этого я изменил его на
STATIC_ROOT = 'static'
Кроме того, в моем файле .conf есть
option_settings:
"aws:elasticbeanstalk:container:python:staticfiles":
"/static/": "static/"
Ответ 4
Я сделал следующее, чтобы исправить статический путь в beanstalk
STATIC_URL = '/static/'
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
option_settings:
...
...
"aws:elasticbeanstalk:container:python:staticfiles":
"/static/": "static/"
Ответ 5
Все предыдущие ответы мне не помогли
Это работает для меня.
По сути, я создал два шага внутри .ebextensions
01_django.config
container_commands:
01_migrate:
command: "source /opt/python/current/env && source /opt/python/run/venv/bin/activate && cd /opt/python/current/app && python manage.py migrate --noinput"
leader_only: true
02_touch_superuser:
command: "source /opt/python/current/env && source /opt/python/run/venv/bin/activate && cd /opt/python/current/app && python manage.py touch_superuser"
leader_only: true
option_settings:
aws:elasticbeanstalk:container:python:
WSGIPath: config/wsgi.py
NumProcesses: 2
NumThreads: 10
aws:elasticbeanstalk:application:environment:
STAGING: 1
DJANGO_SETTINGS_MODULE: config.settings.production
aws:elasticbeanstalk:container:python:staticfiles:
"/static/": "htdocs/static/"
"/media/": "htdocs/media/"
config/wsgi.py
Может быть другой путь в вашем проекте
02_collec_static.config
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/10_collect_static.sh":
mode: "000755"
owner: root
group: root
content: |
set -xe
source /opt/python/current/env
source /opt/python/run/venv/bin/activate
cd /opt/python/current/app && python manage.py collectstatic --noinput
echo "Statics collected...!!"
Важно то, что вы settings/*.py
должны соответствовать вашему статическому пути, который обслуживает EBS, в моем случае это мой конфиг.
...
PROJECT_PATH = dirname(dirname(dirname(__file__)))
MEDIA_ROOT = os.path.join(PROJECT_PATH, 'htdocs/media')
STATIC_ROOT = os.path.join(PROJECT_PATH, 'htdocs/static')
...
Ответ 6
Я долго боролся с этим, думая, что проблема была в:
option_settings:
"aws:elasticbeanstalk:container:python:staticfiles":
"/static/": "static/"
Но на самом деле моя проблема была с другими командами в файле xxx.config.
в основном, убедитесь, что остальные строки верны.
Если вы хотите узнать мои личные настройки, я использовал файл настроек, показанный выше, и добавил статический каталог в корень моего проекта.
Для файла settings.py вот что у меня было для static_url и root:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = 'static'
Надеюсь, это поможет!