Monthly Archives: December 2015

flask+flask-socketio使用方案总结

最近一个项目中碰到了这样一种非常常见的需求,一个网站有两种角色,一种是咨询师,一种是问问题的用户,一个直接的需求是,当有用户提问题的时候,所有的咨询师都能得到通知,当咨询师回答问题的时候,只有提这个问题的用户可以收到通知,用户可以对咨询师的回答进行评价,当评价完毕的时候只有回答问题的咨询师得到通知,这么一个简单的需求基本上涵盖了socket io的所有模式,三种实现方案总结如下,
1. 登录时为每一个用户和咨询师创建房间,例如’user_<user_id>’,然后分别在提出问题,回答问题,评价答案的环节,向对应的room来广播消息
2. 登录时根据角色分别加入’users’和’consultants’两个room,在不同环节向对应的room广播消息,然后由客户端来处理是否相应改消息
3. 混合方案1和2

项目是用flask+flask-socketio实现的,咨询师相关代码如下所示,要注意的是flask-socket有很多API是必须在socket io的上下文才能调用,

client端js代码,

var socket = io.connect(‘http://’ + document.domain + ‘:’ + location.port + ‘/consultants’);
socket.on(‘connect’, function(data) {
    socket.emit(‘join’,”);
    socket.on(‘question_added’,function(data){
    console.log(data);
    });
});

server端python代码,

@socketio.on(‘join’, namespace=’/consultants’)
def join_consultant_room(json):
    join_room(‘consultants’)

下面这句在user创建问题的controller里完成保存逻辑后触发,最重要的一点这个是配合room和namespace参数去调用,不必要在socket io的上下文中去调用,这个是我们有时候建立看似冗余的room的原因,
socketio.emit(‘question_added’, ‘question created’, room=’consultants’, namespace=’/consultants’)

用户相关的代码类似,不再列出。