我正在尝试将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及其与错误的关系。因为我不想解决大部分项目,我该如何解决这个问题并与应用程序工厂一起部署?
答案 0 :(得分:1)
应用程序工厂创建应用程序实例,为其注册路由并返回该实例。
将application
分配为从对create_app
的调用返回的值即可满足EB的要求,即将实现WSGI的可调用对象公开为application
名称。