Flask SocketIO 从服务器向房间发送消息

8
在我的应用程序中,我需要客户端加入一个房间,这样它才能从我的服务器接收消息。请查看以下的服务端代码:
@socketio.on('join', namespace='/test')
def join(message):

    join_room(message['room'])
    room = message['room']
    emit('my response', {'data': 'Entered the room ' + message['room']}, room=room)


@app.route('/scan/user/<int:user_id>/venue/<int:venue_id>', methods = ['POST'])
@auth.login_required
def scan_tablet_user_func(user_id, venue_id):

    room = 'venue_' + str(venue_id)
    socketio.emit('my response', {'data': json.dumps(my_info, ensure_ascii=False)}, room=room)

客户端代码

$('form#join').submit(function(event) {
            socket.emit('join', {room: $('#join_room').val()});
            return false;
        });

一旦网页加载完成,我就在名为“join”的网页表单中输入“venue_1”。同时,在服务器端,变量“room”也被设置成了“venue_1”。
问题在于当我调用API“ /scan/user/...”时,客户端上并没有任何显示。
emit('my response', {'data': 'Entered the room ' + message['room']}, room=room)

显示正确。

1个回答

5

我认为你需要在API调用中的emit函数中提供一个命名空间参数,因为你已经定义了一个命名空间。

socketio.emit('my response', {'data': json.dumps(my_info, ensure_ascii=False)}, room=room, namespace='/test')

如果你不提供命名空间,将使用默认命名空间。


2
正确。当您回复客户端发送的事件时,命名空间是从客户端事件中获取的。当服务器是发起者时,该上下文不存在,因此您必须提供命名空间。 - Miguel Grinberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接