如何使用应用程序工厂将 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的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Visual Studio Flask 应用程序部署到 Elastic Beanstalk