1

我在部署到Elastic Beanstalk后出现ImportError错误。我们正在运行Falcon来制作一个API。我已成功使用EB CLI初始化应用程序,创建环境并部署我的代码。我们使用Python 2.7(现在)。ImportError - 将Falcon应用部署到AWS Elastic Beanstalk

的AWS EB网站的应用程序/环境说一切都很顺利,但是当我发送到API的请求,日志显示此错误:

[Wed Nov 30 06:02:25.555507 2016] [:error] [pid 29352] [remote 127.0.0.1:56624] Traceback (most recent call last): 
[Wed Nov 30 06:02:25.555524 2016] [:error] [pid 29352] [remote 127.0.0.1:56624] File "/opt/python/current/app/api/app.py", line 12, in <module> 
[Wed Nov 30 06:02:25.555549 2016] [:error] [pid 29352] [remote 127.0.0.1:56624]  from middlewares import require_json 
[Wed Nov 30 06:02:25.555566 2016] [:error] [pid 29352] [remote 127.0.0.1:56624] ImportError: No module named middlewares 
[Wed Nov 30 06:02:26.558411 2016] [:error] [pid 29352] [remote 127.0.0.1:60720] mod_wsgi (pid=29352): Target WSGI script '/opt/python/current/app/api/app.py' cannot be loaded as Python module. 

本地进口我的工作就好了。 API的相关部分是这样的:

-api/ 
    -__init__.py #import app 
    -app.py 
    -middlewares/ 
     -__init__.py #import require_json 
     -require_json.py 

线12我app.py文件:

from middlewares import require_json 

但日志一直说这是一个ImportError。有关这里发生了什么的任何想法?我很困惑。

至于__init__.py文件导入模块;这是一个遗留的代码库,我不确定那些改变的含义是什么,除了测试会失败。

编辑

今天早上我已经试过注释掉那些进口的线条,但只是给了我的错误就下输入:

[Wed Nov 30 21:52:00.699228 2016] [:error] [pid 11254] [remote 172.31.8.163:37352] Traceback (most recent call last): 
[Wed Nov 30 21:52:00.699245 2016] [:error] [pid 11254] [remote 172.31.8.163:37352] File "/opt/python/current/app/api/app.py", line 15, in <module> 
[Wed Nov 30 21:52:00.699270 2016] [:error] [pid 11254] [remote 172.31.8.163:37352]  import resources 
[Wed Nov 30 21:52:00.699288 2016] [:error] [pid 11254] [remote 172.31.8.163:37352] ImportError: No module named resources 

我也做什么在this article推荐。

import sys 
sys.path.insert(0, '/opt/python/current/app') 

回答

3

与您的代码似乎直接结构化,你不应该指向WSGIScriptAlias指令的Apache你app.py文件的方式。

你需要做的是创建一个单独的WSGI脚本文件,WSGIScriptAlias使用,它具有:

from api.app import application 

您还需要配置的mod_wsgi从而使api目录的父目录是在Python模块搜索路径。你可以在mod_wsgi配置中完成,或者在新的WSGI脚本文件中完成。

假设你已经在为api出现一个子目录相同的目录添加的WSGI脚本文件为app.wsgi,它可以包括:

import os 
import sys 

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

from api.app import application 
+0

谢谢......我误以为我并不需要一个WSGI脚本,现在起作用。 – JasTonAChair

+1

问题是,您正在通过路径(它是Python包的一部分)到达代码文件。因此,Python没有意识到包的根源在哪里。 –

相关问题