22

我正在尝试在弹性 beantalk 上建立一个简单的 django 应用程序。我以为我已经弄清楚了应用程序的静态部分,因为它可以与 heroku 和手动设置的服务器一起使用。在调试中,我什至签入了静态目录中的静态文件以试图简化事情。映射似乎很奇怪,因为它似乎不遵循 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',
)

网址.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"
4

8 回答 8

24

我今天遇到了同样的问题,我意识到我在 .ebextensions/.config 文件中忘记了这个选项。确保你也拥有它

option_settings:
  - namespace: aws:elasticbeanstalk:container:python:staticfiles
    option_name: /static/
    value: static/
于 2013-02-17T14:24:39.587 回答
20

众所周知,最近版本的 EBS 中静态文件的命名空间已更改为aws:elasticbeanstalk:environment:proxy:staticfiles,如下所示:

option_settings:
  aws:elasticbeanstalk:environment:proxy:staticfiles:
    /static: static
于 2020-06-17T08:04:51.317 回答
16

要支持多个应用程序并执行此操作,您需要运行 collectstatic

设置.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/"

这将在您运行时为您运行 collect staticeb deploy

于 2017-04-18T12:00:31.503 回答
9

如果您的环境使用基于 Amazon Linux 2 的平台分支,则 .ebextensions 文件夹中的 .config 文件的正确设置

aws:elasticbeanstalk:environment:proxy:staticfiles:
    /static: static

在您的项目 settings.py 中 ,您应该拥有:

STATIC_URL = '/static/'
STATIC_ROOT = 'static'
于 2020-12-28T23:34:20.657 回答
7

对我来说,问题在于

STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'static')

相反,我将其更改为

STATIC_ROOT = 'static'

另外,我的 .conf 文件有

option_settings:
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": "static/"
于 2017-07-11T01:15:51.340 回答
2

所有以前的答案都没有帮助我这对我有用。

基本上我在里面创建了两个步骤.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')
...
于 2019-10-05T20:35:17.373 回答
1

我做了以下修复beantalk中的静态路径

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/"
于 2018-07-04T08:18:29.833 回答
1

我为此挣扎了很长时间,认为问题出在:

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'

希望能帮助到你 !

于 2019-08-26T20:13:08.220 回答