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

Posted

技术标签:

【中文标题】如何使用应用程序工厂将 Flask 应用程序部署到 AWS Elastic beanstalk【英文标题】:How to deploy Flask app to AWS Elastic beanstalk using an application factory 【发布时间】:2019-03-29 10:27:33 【问题描述】:

我正在尝试将我的 Flask 应用程序部署到 AWS 并收到 403 Forbidden 错误。在使用 AWS 进行大量测试后,我似乎发现这是一个错误。我的 Flask 应用程序目前是使用应用程序工厂编写的,看起来像这样(简化):

from flask import Flask

def create_app(test_config=None):
    application = Flask(__name__)
    app = application

    @app.route('/')
    def index():
        return "The index page"

    ...

    return app

但是,在我在 Elastic beanstalk 上设置环境并在那里部署我的 Flask 应用程序后,我访问了索引页面,我收到了 403 Forbidden 错误。我检查了我的 EB 日志,并看到一条错误消息

"目标 WSGI 脚本 '/opt/python/current/app/server/application.py' 不包含 WSGI 应用程序“应用程序”。”

起初我很困惑。我以前在 EB 上遇到过其他错误,并在网上查看过。我不太了解 WSGI 标准是什么,但我看到有人说 EB 只有在 Flask “app” 对象被命名为 “application” 时才能工作,这是我故意更改的。然后我查看了 AWS 文档,发现他们的示例没有使用应用程序工厂,因此我预感测试没有使用应用程序工厂:

from flask import Flask

application = Flask(__name__)    
app = application

...    

@app.route('/')
def index():
    return "The index page"

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

这行得通。我只能得出结论,因为“应用程序”对象是在应用程序工厂中定义的,或者它返回应用程序而不是使用 application.run() 的事实,它没有向 EB 注册。同样,我不太了解 WSGI 以及它与错误的关系。由于我不想重写我的大部分项目,我该如何解决这个问题并使用应用程序工厂进行部署?

【问题讨论】:

【参考方案1】:

应用程序工厂创建应用程序实例,为其注册路由并返回该实例。

application 分配为等于对create_app 的调用返回的值满足了EB 的要求,即实现WSGI 的可调用对象公开为application 名称。

【讨论】:

所以你是说,在我原来的应用工厂'create_app'之后,我需要添加一个'application = create_app()',它会工作吗? 您好,您的建议似乎奏效了!谢谢!

以上是关于如何使用应用程序工厂将 Flask 应用程序部署到 AWS Elastic beanstalk的主要内容,如果未能解决你的问题,请参考以下文章

flask使用工厂函数后怎么用uwsgi启动?

如何将 Visual Studio Flask 应用程序部署到 Elastic Beanstalk

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

Flask 部署和分发

部署 Flask 应用

如何从不具有BlobStore的Flask表单直接将视频文件上传到Cloud Storage?