【问题标题】:Cannot locate modules of Django App on AWS Elastic Beanstalk无法在 AWS Elastic Beanstalk 上找到 Django 应用程序的模块
【发布时间】:2015-01-04 19:06:52
【问题描述】:

我正在尝试让 Django 应用程序在 AWS Elastic Beanstalk 上运行,但我遇到了可能是 PYTHONPATH 或 virtualenv 问题的问题,我无法弄清楚。

当我尝试在浏览器中加载页面时,出现黄色的 Django 错误屏幕(我仍处于调试模式):

Exception Value: No module named views.rest
Exception Location: /opt/python/current/app/project/urls.py in <module>, line 3
Python Executable:  /opt/python/run/venv/bin/python
Python Version: 2.7.5
Python Path:    
['/opt/python/run/venv/lib/python2.7/site-packages',
 '/opt/python/current/app',
...

我的 urls.py 导入是:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from myapp.views.rest import *

如果我 ssh 进入 EC2 实例,路径看起来是正确的; /opt/python/current/app 包含我的应用程序,包括 /opt/python/current/app/myapp/views/rest.py

我的目录结构包含(当然还有更多):

app/
    .ebextensions/
        packages.config
        python.config
    .elasticbeanstalk/
        config
        optionsettings.myapp-deployment-env
    project/
        settings.py
    application.py
    myapp/
        views/
            rest.py
            views.py
            __init__.py

__init__.py 我有:

from myapp.views.views import *
from myapp.views.rest import *

但问题并不特定于这些文件 - 如果我向 urls.py 添加另一个导入也会失败,所以它就像根本找不到应用程序一样。

packages.config 我有:

packages:
  yum:
    postgresql-devel: []

python.config 我有(试图加载virtualenv,这可能没有必要?)

container_commands:
  00_activate:
    command: "source /opt/python/run/venv/bin/activate"
  01_make_admin_executable:
    command: "chmod +x scripts/createadmin.py"
    leader_only: true
  02_make_executable:
    command: "chmod +rx application.py"
    leader_only: true
  03_syncdb:
    command: "python manage.py syncdb --noinput"
    leader_only: true
  04_collectstatic:
    command: "python manage.py collectstatic --noinput"

option_settings:
  - option_name: AWS_SECRET_KEY
    value: mykey
  - option_name: AWS_ACCESS_KEY_ID
    value: myaccesskeyid
  - option_name: application_stage
    value: "staging"

如果其他配置文件有帮助,我们很乐意列出它们。它们确实包括设置位置,但没有具体引用 PYTHONPATH 等。

[aws:elasticbeanstalk:application:environment]
DJANGO_SETTINGS_MODULE=project.settings

我已经运行了eb updategit aws.push

真的很纠结这个!我第一次尝试 AWS 部署,所以显然错过了一些重要的事情。如果有人知道我错过了什么,非常感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    这原来是一个 mod_wsgi 与 Django 开发服务器的问题。 Graham Dumpleton 的This post 对理解它非常有帮助(不能略读)。

    mod_wsgi 需要被告知我的站点的位置。我的 WSGI 文件 (application.py) 现在看起来像这样,并且导入工作:

    import os
    import sys
    
    sys.path.insert(0, '/opt/python/current/app')
    
    os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
    
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    

    【讨论】:

    • 差不多 2 年后......仍然相关。谢谢!
    • 我有点犹豫要不要这样做。首先,它看起来像一个黑客。其次,初始化时 /opt/python/current/app 将为空,这意味着添加命令的常用方式: container_commands: 02_makemigrations: #necessary for auth_table command: "django-admin.py makemigrations--noinput" leader_only: true很可能会失败。但是我必须承认我没有找到更好的方法。我试图包含 PYTHONPATH,但这对我来说也失败了。
    猜你喜欢
    • 1970-01-01
    • 2015-12-11
    • 2020-03-14
    • 2015-01-25
    • 2018-09-14
    • 2015-05-07
    • 1970-01-01
    • 2019-08-11
    • 2016-10-28
    相关资源
    最近更新 更多