使用gunicorn时套接字握手错误

时间:2021-01-03 12:41:00

标签: flask websocket twilio gunicorn flask-sockets

我有一个 Flask 应用程序,可以处理来自 Twilio 的网络套接字音频流。

该应用程序在没有 gunicorn 的情况下运行良好,但是当我使用 gunicorn 启动它时,我只收到套接字的第一条消息(连接)和不成功的握手。以下是该应用的外观:

from flask import Flask
from flask_sockets import Sockets
from geventwebsocket.handler import WebSocketHandler
from gevent import pywsgi
...

app = Flask(__name__)
sockets = Sockets(app)
...
@sockets.route('/media')
def media(ws):
    ...
if __name__ == '__main__':
    server = pywsgi.WSGIServer(('', HTTP_SERVER_PORT), app, handler_class=WebSocketHandler)
    server.serve_forever()

当我直接使用 python flaskapp.py 启动应用程序时,它工作正常。

当我使用 gunicorn 开始编写时:

gunicorn -k flask_sockets.worker --bind 0.0.0.0:5055 --log-level=bug flaskapp:app

这是连接“挂起”的地方,并且只进行初始连接,显然是由于握手失败。

需要注意的是,我没有“gevent猴子修补”代码,但我不确定它是否与问题有关。

任何想法将不胜感激!

1 个答案:

答案 0 :(得分:0)

目前没有能力对此进行测试,但也许可以尝试:

from flask import Flask
from flask_sockets import Sockets
from geventwebsocket.handler import WebSocketHandler
from gevent import pywsgi
...

app = Flask(__name__)
sockets = Sockets(app)
...
@sockets.route('/media')
def media(ws):
    ...

server = pywsgi.WSGIServer(('', HTTP_SERVER_PORT), app, handler_class=WebSocketHandler)

if __name__ == '__main__':
    server.serve_forever()

然后将启动命令改为:

gunicorn -k flask_sockets.worker --bind 0.0.0.0:5055 --log-level=bug flaskapp:server

(Gunicorn 应该导入 server 对象,该对象不能存在于最终的 if 语句中,因为该代码仅在直接使用 python 启动时运行)。

相关问题