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对象,而连接断开
posted @ 2021-12-01 10:48  河图s  阅读(136)  评论(0)    收藏  举报