flask开发问题总结
1. flask-sockets 问题描述
flask-sockets 是通过wsgi模块实现的,此模块是一个单线程,由于WSGIServer 模块 是集成了http和 websocket 两种协议
同时websocket 是通过 while not ws.closed: 这个flag 控制while 循环, 如果while 循环退出了表示断开了连接
所以既要保证websocket 一直连接,又要保证http在建立socket连接时不会出现pending状态,两种请求同时可以顺利通过
1.1 解决方案
线程中,使用gevent.money做协程切换,视图中的最上放写入以下代码
# from gevent import monkey;monkey.patch_all(thread=False) 由于项目中还有其他线程,设置thread=False 表示不阻塞主线程运行
websocket视图中
@sockets.route("/test")
def test(ws):
"""
websocket 建立连接后保存在全局config对象中,
扫码枪扫到数据后从config对象中取出ws对象直接send
"""
data = {"data": None, "code": None}
data["data"] = "connected"
data["code"] = "-1"
ws.send(json.dumps(data))
while not ws.closed:
app.config['ws_object']["ws"] = ws
logger.info("连接建立成功,已加入config对象空间>>>{}".format(app.config["ws_object"]))
gevent.sleep(86400) # 使用gevent 的sleep() 函数 阻塞一下上面逻辑,否则会一直实例化最新的websocket连接,导致找不到之前的socket对象,而连接断开
python防脱发技巧

浙公网安备 33010602011771号