这似乎是一个常见的问题,但到目前为止,答案的答案仍然没有对我有用 .
Django:1.6.2 Python:2.7.5
我正在尝试在AWS Elastic beanstalk上部署Django应用程序 . 我目前的Django项目结构是 -
requirements.txt .ebextensions |-myproject.config myproject | |-init.py |-manage.py |-settings |-init.py (all common settings param) |-active.py (to select which of production or development settings to choose) |-production.py |-development.py |-apps |-polls |-init.py |-models.py |-views.py |-urls.py |wsgi.py
我的 wsgi.py
文件如下 -
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.active")
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.active'
from os.path import abspath, dirname, join
from site import addsitedir
ROOT = os.path.join(os.path.dirname(__file__), '..')
sys.path.insert(0, ROOT)
PROJECT_ROOT = os.path.dirname(__file__)
sys.path.insert(0, PROJECT_ROOT)
sys.path.insert(0, abspath(join(PROJECT_ROOT, 'apps'))
sys.path.append('/opt/python/ondeck/app/myproject/')
sys.path.append('/opt/python/ondeck/app/myproject/apps')
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
.ebextenstions/myproject.config
的设置如下
container_commands:
01_syncdb:
command: "django-admin.py syncdb --noinput"
leader_only: true
02_collectstatic:
command: "django-admin.py collectstatic --noinput"
option_settings:
- namespace: "aws:elasticbeanstalk:container:python"
option_name: WSGIPath
value: "myproject/wsgi.py"
- option_name: DJANGO_SETTINGS_MODULE
value: "settings.active"
- namespace: "aws:elasticbeanstalk:container:python:staticfiles"
option_name: "/static/"
value: "static/"
我也尝试将 --settings=settings.active
参数传递给 django-admin.py
以获得相同的错误 . DJANGO_SETTINGS_MODULE
环境变量设置为 settings.module
这些命令适用于 manage.py
问题是,如果从 .ebextensions/myproject.config
文件,我给 container_command
到 django-admin.py syncdb --noinput
,我得到以下错误 -
2014-03-12 08:16:45,988 [ERROR]命令01_syncdb(django-admin.py syncdb --noinput)失败2014-03-12 08:16:45,989 [DEBUG]命令01_syncdb输出:Traceback(最近一次调用) last):ImportError:无法导入设置'settings.active'(是否在sys.path上?设置文件中是否有导入错误?):没有名为settings.active的模块
当我尝试在我的开发机器上本地执行它时,我得到相同的错误 . 但是,如果在我的开发机器上,我将 PYTHONPATH
设置为与我在 wsgi.py
文件中指定的相同,即
PYTHONPATH=/path/to/myproject
然后命令在本地成功 . 但是,尽管我在 wsgi.py
文件中设置了相同的路径,但它在beanstalk上失败了 .
那么有没有办法避免这个错误而不设置PYTHONPATH?如果没有,我如何为AWS Elastic Beanstalk设置它?
3 回答
我通过在
wsgi.py
本身上添加sys.path
的项目路径来修复它 . 也许你可以试试 .尝试将
wsgi.py
和.ebextenstions/myproject.config
中的DJANGO_SETTINGS_MODULE
值修改为myproject.settings.active
.即使我还能够通过Andres回答和Unoti的后续评论来解决设置导入问题 - >
要使用django生成的wsgi(在我的例子中为1.9),请将其添加到wsgi文件中:
我发现这是一个有趣的阅读,似乎仍然相关:
2. 因为我们不再假设wsgi文件的位置和内容是为 生产环境 而设置的,另一个选择是将wsgi文件复制到项目之外,只需更改设置模块路径地址设置即可 .
ps. 我会提到,即使这可能赢得了't work for you since you don'可以访问apache配置(?),但是(对于那些人),你可以通过以下方式使用'python-path'配置: