我试图在AWS Elastic Beanstalk上运行一个Django应用程序,但我看起来似乎可能是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 *
如果我进入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 update
和git aws.push
。
真的挣扎着这个!我第一次尝试AWS部署显然错过了一些重要的事情。如果有人知道我错过了什么,真的很感激帮助。
答案 0 :(得分:8)
这结果是mod_wsgi vs 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()