当前位置:  开发笔记 > 编程语言 > 正文

为什么在AWS EB Python部署中不使用django进行whitenoise工作?

如何解决《为什么在AWSEBPython部署中不使用django进行whitenoise工作?》经验,为你挑选了1个好方法。

我正在AWS Elastic Beanstalk上部署一个python应用程序,并使用DjangoWhiteNoise包装器包装wsgi应用程序.但是,我对静态文件的请求得到了404.

# wsgi.py
...
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)

# settings.py
...
STATIC_URL = '/static/'
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
STATIC_ROOT = os.path.abspath(os.path.join(BASE_DIR, '..', '.staticfiles'))

# .ebextensions/01_django.config
option_settings:
  "aws:elasticbeanstalk:application:environment":
    DJANGO_SETTINGS_MODULE: "myproject.settings.aws_ebs"
    PYTHONPATH: "/opt/python/current/app:$PYTHONPATH"
  "aws:elasticbeanstalk:container:python":
    WSGIPath: "myproject/wsgi.py"
container_commands:
  01_migrate:
    command: "django-admin.py migrate --noinput"
    leader_only: true
  02_collectstatic:
    command: "django-admin.py collectstatic --noinput"

我在这里错过了什么吗?



1> pjotr_dolphi..:

这不容易捕捉到.但是,apache正在为wsgi应用程序提供服务,如果你在/ etc/httpd中使用grep,你会看到一些怀疑.

[ec2-user@ip-1-1-1-1 ~]$ cd /etc/httpd/
[ec2-user@ip-1-1-1-1 httpd]$ find . -type f -exec grep static {} +
./conf.d/wsgi.conf:Alias /static/ /opt/python/current/app/static/
./conf.d/wsgi.conf:

更深入的是,在wsgi.conf文件中:

Alias /static/ /opt/python/current/app/static/

Order allow,deny
Allow from all

这意味着对/static/some/resource.css的请求永远不会到达wsgi应用程序,并且/ opt/python/current/app/static /中不存在这些文件,因此它将返回404.

有几个选项可以解决这个问题:)

1.跳过WhiteNoise并通过apache提供文件.

删除wsgi.py中的最后两行,以便您只使用django wsgi应用程序.同时更改以下内容:

# settings.py - set the storage to use djangos built in ManifestStaticFilesStorage
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

# .ebextensions/01_django.conf - add this to option_settings section
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": ".staticfiles/"

此解决方案的缺点是文件不会被压缩.但是,无论如何,您可能会使用某种CDN作为静态文件,然后压缩文件就不会有任何问题.AWS CloudFront是可用于启用静态文件压缩的​​CDN示例.

2.设置STATIC_URL ='/ staticfiles /'

将STATIC_URL更改为'/ static /'的其他内容,例如'/ staticfiles /',这样就不会与'/ static /'别名匹配,而django将提供静态文件,而不是apache.

旁注

遗憾的是,AWS EB Python环境不允许您删除/ static/Alias,既不使用eb命令行工具,也不使用Web界面.看看这里:

AWS Web Console AWS Elastic Beanstalk Python配置

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有