【问题标题】:No module named 'application' Error while deploying simple web app to Elastic Beanstalk将简单的 Web 应用程序部署到 Elastic Beanstalk 时没有名为“应用程序”的模块错误
【发布时间】:2020-10-10 05:54:36
【问题描述】:

我正在使用本教程和他们拥有的相同“application.py”文件将 Web 应用程序部署到弹性 beanstalk:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-flask.html#python-flask-setup-venv

我在访问该站点时收到 502 错误,并且环境的健康状况已降级/严重。当我检查日志时,我看到了这一点(我认为这是问题的根源):

Jun 19 22:05:18 ip-172-31-15-237 web: File "/usr/lib64/python3.7/importlib/__init__.py", line 127, in import_module
Jun 19 22:05:18 ip-172-31-15-237 web: return _bootstrap._gcd_import(name[level:], package, level)
Jun 19 22:05:18 ip-172-31-15-237 web: File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
Jun 19 22:05:18 ip-172-31-15-237 web: File "<frozen importlib._bootstrap>", line 983, in _find_and_load
Jun 19 22:05:18 ip-172-31-15-237 web: File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
Jun 19 22:05:18 ip-172-31-15-237 web: ModuleNotFoundError: No module named 'application'

这是我的 application.py 文件:


from flask import Flask

# print a nice greeting.
def say_hello(username = "World"):
    return '<p>Hello %s!</p>\n' % username

# some bits of text for the page.
header_text = '''
    <html>\n<head> <title>EB Flask Test</title> </head>\n<body>'''
instructions = '''
    <p><em>Hint</em>: This is a RESTful web service! Append a username
    to the URL (for example: <code>/Thelonious</code>) to say hello to
    someone specific.</p>\n'''
home_link = '<p><a href="/">Back</a></p>\n'
footer_text = '</body>\n</html>'

# EB looks for an 'application' callable by default.
application = Flask(__name__)

# add a rule for the index page.
application.add_url_rule('/', 'index', (lambda: header_text +
    say_hello() + instructions + footer_text))

# add a rule when the page is accessed with a name appended to the site
# URL.
application.add_url_rule('/<username>', 'hello', (lambda username:
    header_text + say_hello(username) + home_link + footer_text))

# run the app.
if __name__ == "__main__":
    # Setting debug to True enables debug output. This line should be
    # removed before deploying a production app.
    #application.debug = True
    application.run()

这是我的 requirements.txt 文件:

click==7.1.2
Flask==1.1.2
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
numpy==1.16.3
pandas==0.24.2
python-dateutil==2.8.1
pytz==2020.1
six==1.15.0
Werkzeug==1.0.1

我上传到 elastic beanstalk 的压缩文件夹仅包含这两个文件。我那里也有一个虚拟环境,但是教程说你不需要它,所以我把它去掉了。

我也在运行 Python 3.7.1,所以我有 pip3。我应该注意到,当我只运行 python 代码时,网络应用程序就可以工作。

【问题讨论】:

    标签: python amazon-web-services flask amazon-elastic-beanstalk


    【解决方案1】:

    一个可能的原因是使用了Amazon Linux 2 环境,而不是Amazon Linux 1

    python 环境及其 linux 发行版的列表是here

    从您提供的链接:

    在本教程中我们使用 Python 3.6 和相应的 Elastic Beanstalk 平台版本。

    Amazon Linux 1 环境支持 Python 3.6,而您使用的是用于Amazon Linux 2 环境的 Python 3.7。

    AL1 和 AL2 之间存在许多差异,这使得它们不兼容

    【讨论】:

    • 是的,我认为确实如此。非常感谢!现在讨论其他错误 ;)
    • @HunterSwag 没问题。如果答案有帮助,我们将不胜感激。
    • 那么 Amazon Linux 2 会怎么样?
    • @Piranna 嗨。我认为用 AL2 的相关细节提出新问题会更好。您可以在 AL2 中添加新的错误消息,并且 SO 上的其他人也可以看到问题并提供帮助。
    【解决方案2】:

    我和你有同样的问题。降级到 AL1 确实可以解决这个问题,但会带来更多问题。

    我发现您可以通过在文件末尾添加以下行来使您的应用兼容。

    app = application

    另外,您可以在定义烧瓶实例时执行此操作:

    application = app = Flask(__name__) 如果需要,不要忘记将两者都导入到 application.py 中。

    这是可行的,因为 aws 需要将 Flask 实例称为应用程序,而 gunicorn 需要将 Flask 实例称为应用程序,所以这样你就可以让他们都开心。

    世界上的每个人都称那里为 Flask 实例 app execpt for aws。

    【讨论】:

      【解决方案3】:

      在弹性 beanstalk 上部署我的烧瓶应用程序时,我必须做 两件事 来解决 No module named 'application' 错误:

      1. 正如Quinten Cabo 提到的,我重命名了app 变量:
      application = app = Flask(__name__)
      
      1. 另外,我需要将包含应用程序的 python 文件从 app.py 重命名为 application.py

      【讨论】:

        猜你喜欢
        • 2021-01-08
        • 2022-01-25
        • 2012-07-04
        • 2016-07-01
        • 2015-09-21
        • 2020-09-02
        • 2016-07-06
        • 2016-11-12
        • 2020-02-21
        相关资源
        最近更新 更多