我正在尝试部署一个相当简单的Flask应用程序,使用Google的app Engine提供几个视图。据我所知,Flask代码本身没有任何问题--它在本地端口上运行得很好。然而,当我进入项目目录并运行"gcloud app deploy“时,问题就出现了。当我进入为应用程序保留的.appspot.com域时,应用程序部署时没有任何错误,并返回502代码。
我有点困惑,所以我运行了"gcloud app logs tail“。这是日志中显示在repeat上的消息:
* Serving Flask app "main" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
[2019-01-06 23:55:00 +0000] [240] [INFO] Starting gunicorn 19.9.0
[2019-01-06 23:55:00 +0000] [240] [ERROR] Connection in use: ('', 8081)
[2019-01-06 23:55:00 +0000] [240] [ERROR] Retrying in 1 second.
[2019-01-07 23:55:01 +0000] [240] [ERROR] Can't connect to ('', 8081)
运行"netstat -ano“不会显示任何实际使用端口8081的进程。在一篇与我的问题类似的帖子中,建议运行netstat并杀死正在使用被占用端口的任何进程。然而,这里没有使用8081的字面意思。
"main“是main.py,一个创建应用程序、注册所有蓝图并运行应用程序的文件
app.run(host="0.0.0.0", debug=True)
我对App Engine的使用完全陌生--我是不是错过了什么?有人知道从哪里开始吗?
发布于 2019-01-08 14:25:29
我已经在我这边测试了这个问题,并且我已经能够重现错误消息。
问题是,在main.py文件中,您从脚本的根目录调用app.run(host="0.0.0.0", debug=True)
行。
您的main.py
中应该有下面这一行,如下所示:
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
此conditioning的作用是确保其嵌套语句仅在文件直接执行时执行,即在本地计算机上运行python main.py
。
app.run语句的作用是在本地开发服务器中执行Flask应用程序,该应用程序是在主机方向(在您的示例中为"0.0.0.0",在flask中表示应用程序在外部公开)和特定端口(缺省为5000)中创建的。
您使用gunicorn作为应用程序的入口点,并将其指向main
脚本中的app
对象,如app.yaml
文件中所定义。但是由于flask应用程序已经在由app.run
语句创建的另一台服务器上运行,gunicorn无法指向该应用程序,因此它无法为请求提供服务。
简而言之,在部署到App Engine时不要执行app.run
。
https://stackoverflow.com/questions/54067092
复制相似问题