flask-socketio模块的使用

flask-socketio

github

socket.io框架使用的是websocket协议,服务端和客户端都可以向对方发送请求,常见环境是聊天室,异步任务返回结果

以前

  1. 前端长轮询来获取某个任务的结果,比较耗资源

使用websocket协议

  1. 双方都可以发起请求
  2. 也是基于http协议

使用方式

  1. 首先需要设定异步服务的方式,推荐依次是:eventlet->gevent->theading
  2. 判断使用什么消息队列,redis/rabbitmq->kombu模块支持的消息队列均可以
  3. 对于flask而言,启动方式类似

    1
    2
    socketio = SocketIO(app, message_queue=f'redis://localhost:6379/1', async_mode='gevent')
    socketio.run(app, '10.10.21.145', port=1233, debug=True)
  4. 使用socketio的时候,消息以事件的形式被双方接收。客户端使用Javascript的回调函数,服务端需要为事件注册处理函数,就像在视图中注册路由处理函数那样。

  5. 使用on关键字来建立事件处理函数,支持返回数据供客户端回调使用
  6. SocketIO事件处理函数可以通过调用send()和emit()函数来向链接的客户端发送回应消息,使用broadcast=True来实现对每一个命名空间下的链接批量发送消息
  7. Flask-SocketIO通过join_room()leave_room()函数来实现每个链接的独立性
  8. connectdisconnect事件分别代表建立链接和断开

部署

使用gonicorn

  • 当在gunicorn中使用gevent worker和WebSocket时,启动命令必须指明使用支持WebSocket的gevent worker:
1
gunicorn --worker-class geventwebsocket.gunicorn.workers.GeventWebSocketWorker module:app

使用uwsgi

  • uwsgi提供的参数必须使用websocket和ssl编译,才能供websocket使用
1
$ uwsgi --http :5000 --gevent 1000 --http-websockets --master --wsgi-file app.py --callable app