前端是通过ajax发送消息 不是socket.emit()
,
后端通过路由处理后再发送socket消息,没有经过@socket_io.on()
初始化,
如果未指定接收方可以通过broadcast=True
发送给所有用户;
如果需要指定用户接收则需要接收方请求的sid,
sid是在调用flask_socketio -> socketio/server ->engineio/server
后生成的,
这里监听connect
事件在开始连接的时候把所有请求的sid保存,通过用户id用字典存储,发送的时候再通过用户id获取到sid
后端代码:
@messages_bp.route('/send-message/', methods=['POST'])
@login_required
def send_message():
sender = current_user._get_current_object()
recipient_username = request.form['to']
recipient = User.query.filter_by(nickname=recipient_username).first_or_404()
message = request.form['message']
if len(message.strip()) != 0 and sender != recipient:
msg = Message(sender_id=sender.id, recipient_id=recipient.id, message=message)
db.session.add(msg)
db.session.commit()
payload = {
'type': 'receive',
'message': render_template('messager/single_message.html', message=msg),
'sender': sender.nickname
}
emit('new message', payload, broadcast=False, namespace=namespace, room=client_query[recipient.id])
# emit('new message', payload, broadcast=True, namespace=namespace)
return render_template('messager/single_message.html', message=msg)
@socket_io.on('connect', namespace=namespace)
def test_connect():
# 建立连接 sid:连接对象ID
client_query[current_user.id] = request.sid
print('connected ==> ', request.sid)
print(f'{len(client_query)} Client connected')
@socket_io.on('disconnect', namespace=namespace)
def test_disconnect():
# 连接对象关闭 删除对象ID
del client_query[current_user.id]
print(f'{len(client_query)} Client connected')
Flask-SocketIO4.3.1
python-engineio3.13.2
python-socketio==4.6.0