Flask-Socketio 应用程序在 Heroku 上出现超时错误
Posted
技术标签:
【中文标题】Flask-Socketio 应用程序在 Heroku 上出现超时错误【英文标题】:Flask-Socketio app getting timeout error on Heroku 【发布时间】:2022-01-05 11:47:43 【问题描述】:抱歉,我对 Web 开发非常陌生,我正在尝试通过使用 gunicorn 和 gevent-websocket 在 Heroku 上设置一个 flask-socketio 应用程序来支持 WebSocket。但是,该应用程序不起作用。我已经设置了一个简单的示例来尝试更好地说明问题。
这是我的 application.py(这里不使用套接字,但在真实版本中使用)
from flask import Flask, render_template
from flask_socketio import SocketIO
import os
app = Flask(__name__)
app.secret_key = os.environ.get('SECRET')
socketio = SocketIO(app)
@app.route("/")
def index():
return render_template("index.html")
app.run()
这是我的 index.html(目前什么都不做)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
test page
</body>
</html>
这是 requirements.txt 文件
bidict==0.21.4
click==8.0.3
Flask==2.0.2
Flask-SocketIO==5.1.1
gevent==21.8.0
gevent-websocket==0.10.1
greenlet==1.1.2
gunicorn==20.1.0
importlib-metadata==4.8.2
itsdangerous==2.0.1
Jinja2==3.0.3
MarkupSafe==2.0.1
python-engineio==4.3.0
python-socketio==5.5.0
typing_extensions==4.0.0
Werkzeug==2.0.2
zipp==3.6.0
zope.event==4.5.0
zope.interface==5.4.0
我正在我的 Procfile 中使用此命令运行应用程序
web: gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 application:app
该应用程序无法运行,并且它的页面显示要检查日志。当我检查日志时,我看到了这个错误:
at=error code=H12 desc="Request timeout" method=GET path="/favicon.ico" host=test-flasksocket.herokuapp.com request_id=c0acb584-c18e-4c86-ba4c-3d176de5b3ed fwd="174.134.134.150" dyno=web.1 connect=0ms service=30000ms status=503 bytes=0 protocol=https
此外,在日志中,此文本会无限重复:
[2021-11-28 04:36:17 +0000] [4] [CRITICAL] WORKER TIMEOUT (pid:17)
[2021-11-28 04:36:17 +0000] [17] [INFO] Worker exiting (pid: 17)
[2021-11-28 04:36:17 +0000] [19] [INFO] Booting worker with pid: 19
* Serving Flask app 'application' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
我以为 gunicorn 是生产服务器,但它似乎是开发服务器?
【问题讨论】:
【参考方案1】:我发现了问题所在。 run 方法需要像这样调用:
if __name__ == "__main__":
app.run()
我不知道为什么在这个块之外运行 app.run() 会导致我遇到的问题,但似乎是。
【讨论】:
以上是关于Flask-Socketio 应用程序在 Heroku 上出现超时错误的主要内容,如果未能解决你的问题,请参考以下文章
flask-socketio 在安装了 eventlet 的 aws 上不起作用
使用flask和flask-socketio配置nginx、uwsgi
如何在 docker 容器中设置 flask-socketio?