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

flask-socketio 在安装了 eventlet 的 aws 上不起作用

使用flask和flask-socketio配置nginx、uwsgi

如何在 docker 容器中设置 flask-socketio?

Elasticbeanstalk 上的 Flask-socketIO

在 Flask-SocketIO 上使用 ssl 设置 ping_timeout