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

时间:2018-10-24 22:11:22

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

我正在尝试将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 beantalk上设置环境并在其中部署我的Flask应用程序之后,我访问了索引页面,我收到403 Forbidden错误。我检查了我的日志中的EB,并看到一条错误消息

  

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

起初我很困惑。我以前在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 个答案:

答案 0 :(得分:1)

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

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