尝试将 Flask 应用程序部署到 AWS Elastic Beanstalk 时,我不断收到“ModuleNotFoundError: No module named 'app'”错误消息

Posted

技术标签:

【中文标题】尝试将 Flask 应用程序部署到 AWS Elastic Beanstalk 时,我不断收到“ModuleNotFoundError: No module named \'app\'”错误消息【英文标题】:When trying to deploy a Flask app to AWS Elastic Beanstalk, I keep getting the "ModuleNotFoundError: No module named 'app'" error message尝试将 Flask 应用程序部署到 AWS Elastic Beanstalk 时,我不断收到“ModuleNotFoundError: No module named 'app'”错误消息 【发布时间】:2021-03-06 17:16:34 【问题描述】:

我正在尝试将 Flask Web 应用程序部署到 AWS Elastic Beanstalk,但始终失败。当我启动环境时,它会抛出 502 错误,并且运行状况设置为 Severe 并出现以下错误:

100.0 % 的请求以 HTTP 5xx 失败。 ELB 进程并非在所有实例上都运行良好。 ELB 运行状况失败或不适用于所有实例。所有实例的服务受损。

我检查了日志,似乎问题可能归结为两个(可能相关的)错误:

    ModuleNotFoundError: 没有名为“app”的模块 在“应用程序”中找不到属性“应用程序”。

作为参考,这是我的应用程序的结构:

myApp/
   app/
      admin/
         __init__.py
         ...
      ms/
         __init__.py
         ...
      wf/
         __init__.py
         ...
      static/
         ...
      templates/
         ...
      __init__.py
      models.py
   app.py
   config.py
   requirements.txt

app.py 模块如下所示:

from app import create_app

application = app = create_app()

if __name__ == "__main__":
    application.run()

app/__init__.py 模块如下所示:

from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_cors import CORS, cross_origin
from flask_bootstrap import Bootstrap
from flask_login import LoginManager
from flask_moment import Moment
import os

db = SQLAlchemy()
migrate = Migrate()
bootstrap = Bootstrap()
login = LoginManager()
login.login_view = 'admin.login'
login.login_message = 'Please log in to access this page.'
moment = Moment()

def create_app(config_class=Config):
    application = app = Flask(__name__)
    app.config.from_object(config_class)
    CORS(app)

    db.init_app(app)
    migrate.init_app(app, db, render_as_batch=True)
    bootstrap.init_app(app)
    login.init_app(app)
    moment.init_app(app)

    from app.ms import bp as ms_bp
    app.register_blueprint(ms_bp, url_prefix='/ms', template_folder='templates', static_folder='static')

    from app.wf import bp as wf_bp
    app.register_blueprint(wf_bp, url_prefix='/wf', template_folder='templates', static_folder='static')

    from app.admin import bp as admin_bp
    app.register_blueprint(admin_bp, url_prefix='/admin', template_folder='templates', static_folder='static')

    return app

from app import models

在 AWS EB 环境(在 64 位 Amazon Linux 2/3.1.3 上运行的 Python 3.7)中,我已将 WSGIPath 配置变量设置为 app:application。我是根据以下建议(来自https://forums.aws.amazon.com/thread.jspa?threadID=321677)这样做的:

对于 Linux 2 - python 3.7,这将转换为“WSGIPath: myapplication:myapp”,其中 myapplication.py 是模块名称,“app”是设置为烧瓶应用程序对象的变量名称。

根据其他帖子的建议,我什至(实际上是多次)将app.py 更改为application.py(同时还编辑了 WSGIPath 变量),但没有成功。

我已经在本地测试了应用程序(使用flask runpython app.py),它在我的本地计算机上正常运行,但是当我部署它时,我得到了错误。

我似乎在无休止地寻找解决方案,并且我相信我已经正确实施了以下(以及许多其他通过我的调试过程)找到的部署和其他修复,但似乎没有一个有效:

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-flask.html https://medium.com/@rodkey/deploying-a-flask-application-on-aws-a72daba6bb80 https://medium.com/@pbojinov/elastic-beanstalk-and-flask-c51e10de7fe0 http://jtushman.github.io/blog/2013/06/12/first-impressions-with-flask-and-elastic-beanstalk/ No module named 'application' Error while deploying simple web app to Elastic Beanstalk https://forums.aws.amazon.com/thread.jspa?threadID=321677

如果有人可以帮助我,将不胜感激!

【问题讨论】:

你在哪里设置app:application?您的应用结构没有显示任何 .ebextentions? 我使用了 Elastic Beanstalk 管理控制台(在配置 > 软件下)部分。我用了.ebextentions一点,但似乎对结果没有影响。 【参考方案1】:

在过去尝试修复部署的过程中,我设法做了足够多的工作以使其接近成功。我重命名了主文件application.py(来自app.py),这似乎解决了我的问题。

我还必须为站点的索引值 ('/') 添加路由,即使使用蓝图也是如此。

【讨论】:

以上是关于尝试将 Flask 应用程序部署到 AWS Elastic Beanstalk 时,我不断收到“ModuleNotFoundError: No module named 'app'”错误消息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用应用程序工厂将 Flask 应用程序部署到 AWS Elastic beanstalk

Flask 应用程序 - 部署到 AWS Elastic Beanstalk 时出错

使用 pandas 将 Flask 应用程序部署到 Elastic Beanstalk

如何使用 SSL 将 AWS EC2 Flask 应用程序部署到 HTTPS 端口 443?

Angular Universal - 部署到 AWS Elastic Beanstalk

将使用 Celery 和 Redis 的 Flask 应用程序部署到 AWS:直接使用 Elastic Beanstalk 还是 EC2?