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

How to deploy Flask app to AWS Elastic beanstalk using an application factory

我正在尝试将 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 日志,并看到一条错误

"Target WSGI script '/opt/python/current/app/server/application.py' does not contain WSGI application 'application'."

起初我很困惑。我以前在 EB 上遇到过其他错误,并在网上查看过。我不太明白 WSGI 标准是什么,但我看到有人说只有当 Flask "app" 对象被命名为 "application" 时,EB 才会工作,我有意更改了这个名称。然后我查看了 AWS 文档并意识到他们的示例没有使用应用程序工厂,所以我预感我没有使用应用程序工厂进行测试:

from flask import Flask

application = Flask(__name__)    
app = application

...    

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

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

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

应用程序工厂创建应用程序实例,为其注册路由和 returns 实例。

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