ImportError - 将 Falcon 应用程序部署到 AWS Elastic Beanstalk

Posted

技术标签:

【中文标题】ImportError - 将 Falcon 应用程序部署到 AWS Elastic Beanstalk【英文标题】:ImportError - deploy Falcon app to AWS Elastic Beanstalk 【发布时间】:2017-04-14 09:04:35 【问题描述】:

我在部署到 Elastic Beanstalk 后遇到 ImportError。我们正在运行 Falcon 来制作 API。我已成功使用 EB CLI 来初始化应用程序、创建环境并部署我的代码。我们使用 Python 2.7(目前)。

应用程序/环境的 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

我的 app.py 文件的第 12 行:

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')

【问题讨论】:

【参考方案1】:

根据您的代码的结构方式,您不应将 Apache 的 WSGIScriptAlias 指令直接指向您的 app.py 文件。

您需要做的是创建一个单独的 WSGI 脚本文件以与 WSGIScriptAlias 一起使用,其中包含:

from api.app import application

您还需要配置 mod_wsgi,以便 api 目录的父目录位于 Python 模块搜索路径中。你可以在 mod_wsgi 配置中做,或者在这个新的 WSGI 脚本文件中做。

假设您已将 WSGI 脚本文件作为 app.wsgi 添加到与 api 相同的目录中,则显示为子目录,它可能包括:

import os
import sys

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

from api.app import application

【讨论】:

谢谢...我误以为我不需要 WSGI 脚本,现在可以了。 问题是你正在通过路径进入一个代码文件,它是 Python 包的一部分。因此,Python 不知道包的根在哪里。

以上是关于ImportError - 将 Falcon 应用程序部署到 AWS Elastic Beanstalk的主要内容,如果未能解决你的问题,请参考以下文章

运维监控系统之Open-Falcon

将应用程序移动到嵌套文件夹后的 ImportError

Open-Falcon学习

ImportError,在谷歌应用引擎中使用 pytz

falcon4的图像引擎

open-falcon架构详解