繁体   English   中英

如何在我的 flask 聊天应用程序中通过 URL 的路径分离 socketio 连接

[英]How to separate the socketio connection by the path of the URL in my flask chat app

我正在尝试使用 Flask-socketio 构建一个聊天应用程序,俱乐部可以让他们的成员互相交谈。 该应用程序使用 URL 中的 arguments 区分不同俱乐部的聊天,如“/chat/<club_code>”路由所示。 但是,socketio 连接正在使用两个俱乐部(club1 和 club2)的消息更新两个聊天。 如何使在“/chat/club1”中发送的消息只能被该特定路线上的人看到,而在“/chat/club2”中发送的消息只能被该特定路线上的人看到。

前端代码:

<html>
<head>
<title>Chat Room</title>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.5.0/socket.io.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript">
$(document).ready(function() {

    var socket = io.connect('http://127.0.0.1:5000');

    socket.on('connect', function() {
        socket.send('User has connected!');
    });

    socket.on('message', function(msg) {
        $("#messages").append('<li>'+msg+'</li>');
        console.log('Received message');
    });

    $('#sendbutton').on('click', function() {
        socket.send($('#myMessage').val());
        $('#myMessage').val('');
    });

});
</script>
<b>this is the chat for {{club_code}}</b>
<ul id="messages"></ul>
<input type="text" id="myMessage">
<button id="sendbutton">Send</button>
</body>
</html>

后端代码:

from flask import Flask, render_template
from flask_socketio import SocketIO, send

app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecret'
socketio = SocketIO(app, cors_allowed_origins='*')

club_list = ['Club1', 'Club2']

@socketio.on('message')
def handleMessage(msg):
    print('Message: ' + msg)
    send(msg, broadcast=True)

@app.route('/chat/<club_code>')
def chat(club_code):
    return render_template('chat.html',club_code=club_code)

if __name__ == '__main__':
    socketio.run(app,debug=True)

现在发生了什么。

您可以将俱乐部代码存储在 session 中,然后使用房间仅将消息发送给某个俱乐部的用户。

from flask import Flask, render_template, session
from flask_socketio import SocketIO, send, join_room

@socketio.on('message')
def handleMessage(msg):
    print('Message: ' + msg)
    send(msg, broadcast=True, to = session['club_code'])
    
@socketio.on('connect')
def connect():
    join_room(session['club_code'])

@app.route('/chat/<club_code>')
def chat(club_code):
    session['club_code'] = club_code
    return render_template('chat.html',club_code=club_code)

当用户加载页面时,会设置club_code session 变量。 connect事件发生时,用户会加入到他们的club_code的房间中。 然后可以使用send方法的to参数将消息发送到相关俱乐部。 有关房间的更多信息,请参阅socket.ioflask-socketio文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM