Amazon Elastic Beanstalk不提供django静态文件

时间:2012-12-26 16:08:06

标签: django amazon-web-services elastic-beanstalk django-staticfiles

我正试图在弹性豆茎上放置一个简单的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',
)

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"

8 个答案:

答案 0 :(得分:19)

您找到了解决方案了吗?只是让你知道。我今天遇到了同样的问题,我意识到我在.ebextensions / .config文件中忘记了这个选项。确保你也拥有它

option_settings:
  - namespace: aws:elasticbeanstalk:container:python:staticfiles
    option_name: /static/
    value: static/

答案 1 :(得分:7)

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

Settings.py

STATIC_ROOT = os.path.join(BASE_DIR, "static")

确保您有一个名为&#34; static&#34;的文件夹。在你的根

在您的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

时,这将为您运行收集静态

答案 2 :(得分:6)

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

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

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

STATIC_URL = '/static/'
STATIC_ROOT = 'static'

答案 3 :(得分:5)

对我来说,问题在于

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

相反,我将其更改为

STATIC_ROOT = 'static'

另外,我的.conf文件有

option_settings:
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": "static/"

答案 4 :(得分:5)

请大家知道,最新版本的EBS中静态文件的命名空间已更改为aws:elasticbeanstalk:environment:proxy:staticfiles,如下所示:

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

答案 5 :(得分: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/"

答案 6 :(得分:1)

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

基本上,我在L 10 20 30 40 50内创建了两个步骤

.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...!!" 应该与EBS服务的静态路径匹配,在我的情况下,这是我的配置。

settings/*.py

答案 7 :(得分:0)

我为此苦苦挣扎了一段时间,以为问题出在:

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'

希望有帮助!