问题描述
我有一个 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猴子修补”代码,但我不确定它是否与问题有关。
任何想法将不胜感激!
解决方法
目前没有能力对此进行测试,但也许可以尝试:
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
启动时运行)。