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'

Надеюсь, это поможет!