ImportError:无法导入设置(是否在> sys.path?设置文件中是否存在导入错误?)在AWS Elastic Beanstalk上

时间:2014-03-12 08:38:33

标签: python django amazon-web-services django-admin elastic-beanstalk

这似乎是一个常见的问题,但到目前为止,答案的答案仍然没有对我有用。

的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(最近一次调用最后一次):   ImportError:无法导入设置&settings; active' (它打开了吗?   sys.path的?设置文件中是否有导入错误?):没有模块   命名settings.active

当我尝试在我的开发机器上本地执行此操作时,我得到了同样的错误。但是,如果在我的开发机器上,我将PYTHONPATH设置为与我在wsgi.py文件中指定的相同,即

PYTHONPATH=/path/to/myproject然后命令在本地成功。但是,尽管我在wsgi.py文件中设置了相同的路径,但它在beanstalk上失败了。

那么有没有办法在不设置PYTHONPATH的情况下避免这个错误? 如果没有,我如何为AWS Elastic Beanstalk设置它?

3 个答案:

答案 0 :(得分:4)

我通过在sys.path本身上添加wsgi.py的项目路径来修复它。也许你可以试试。

答案 1 :(得分:0)

尝试将DJANGO_SETTINGS_MODULEwsgi.py中的.ebextenstions/myproject.config值修改为myproject.settings.active

答案 2 :(得分:0)

尽管我还能够解决Andres回答的设置导入问题以及Unoti的后续评论 - >

要使用django生成的wsgi(在我的例子中为1.9),请将其添加到wsgi文件中:

sys.path.insert(0, os.path.abspath(os.path.dirname(os.path.dirname(__file__))))

我发现这是一个有趣的阅读,似乎仍然相关:

  

其次,wsgi.py是自动生成的,它给了用户   它总是正确的印象,必须使用并且不会   需要修改。结果是人们不再看到其中的一个   WSGi脚本文件的主要作用是用于设置   加载Django应用程序之前的环境变量。   ......来自:https://gist.github.com/GrahamDumpleton/b380652b768e81a7f60c

2。因为我们不再假设wsgi文件的位置和内容是为生产设置的,所以另一个选择是将wsgi文件复制到项目之外并简单地更改设置模块路径地址设置。

<强> PS。 我会提到,即使这可能不适合你,因为你无法访问apache配置(?),但是(对于那些人来说)你可以使用&#39; python -path&#39;配置通过:

WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com