【问题标题】:ImportError: Could not import settings (Is it on > sys.path? Is there an import error in the settings file?) on AWS Elastic BeanstalkImportError:无法在 AWS Elastic Beanstalk 上导入设置(是否在 > sys.path 上?设置文件中是否存在导入错误?)
【发布时间】:2014-04-16 06:18:15
【问题描述】:

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

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_commanddjango-admin.py syncdb --noinput,我会收到以下错误-

2014-03-12 08:16:45,988 [错误] 命令 01_syncdb (django-admin.py syncdb --noinput) 失败 2014-03-12 08:16:45,989 [DEBUG] 命令 01_syncdb 输出:回溯(最近一次调用最后一次): ImportError:无法导入设置“settings.active”(是否打开 系统路径?设置文件中是否存在导入错误?):没有模块 命名为 settings.active

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

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

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

【问题讨论】:

  • 你好。你找到解决方法了吗?谢谢

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


【解决方案1】:

尽管我也能够通过 Andres 回答和 Unoti 的后续 cmets 解决设置导入问题 -->

要使用 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 配置(?),但是(对于那些这样做的人,)您可以通过以下方式使用“python-path”配置:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 哪个wsgi.py 文件?
    • 遇到了同样的问题,这个解决了。我用sys.path += os.path.abspath(os.path.dirname(__file__))添加了我的项目路径有没有更好的方法?
    • 我使用了sys.path = [os.path.abspath(os.path.dirname(__file__))] + sys.path。正如@Charybdis 提到的那样,使用 sys.path += 将其放在最后,效率较低,但也会将每个字符单独添加到路径中,这不是您想要的。另外值得注意的是:确保您的 wsgi.py 处于项目级别而不是应用级别,以使其正常工作。
    • @Unoti 嘿,是的,我后来意识到了这一点,但没想到再回来在这里发表评论。谢谢。
    【解决方案3】:

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

    【讨论】:

    • 它仍然说 - Command 01_syncdb output: Traceback (most recent call last): ImportError: Could not import settings 'myproject.settings.active' (Is it on sys.path? Is there an import error in the settings file?): No module named settings.active
    猜你喜欢
    • 2014-03-29
    • 2013-09-06
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2010-11-01
    • 2012-08-09
    相关资源
    最近更新 更多