使用django-websocket-redis的异步Django

1 投票
1 回答
2859 浏览
提问于 2025-04-18 04:54

我正在尝试使用django-websocket-redis,但即使看了文档,我还是不太明白它是怎么工作的。客户端的部分(JavaScript/模板)我理解得很简单,但我想把数据消息从一个客户端发送到另一个客户端,这里就卡住了。

连接每个客户端:

var ws = new WebSocket('ws://localhost:8000/ws/foobar?subscribe-group');
ws.onopen = function(e) {
        console.log("websocket connected");
    };
    ws.onclose = function(e) {
        console.log("connection closed");
    };

我该如何管理我的views.py,以便在它们之间建立连接呢?在NodeJS中,我是用这段代码来连接客户端的:

io.sockets.on('connection', function (socket) {
    var data={"action": "connexion", "session_id": socket.id,};
    socket.emit('message',data);

    socket.on('message', function(socket){
        if (socket.action == "test")
        {
            io.sockets.socket(socket.code).emit('message',{"action": "move"}); 
            //the socket.code is the session_id of the client one transmitted by a form
        }
    });
});

谢谢你。

1 个回答

3

在你的Django的 view.py 和Websocket循环之间,有一个连接就是Redis消息队列。可以想象一下,服务器上有两个独立的主循环:一个是处理HTTP请求的,使用的是普通的Django请求处理器;另一个是处理Websockets的,负责那些长时间保持连接的。因为你不能在普通的Django请求处理器中混合这两个循环,所以需要消息队列来让它们互相沟通。

因此,在你的Django view.py 中,你可以用类似下面的方式把数据发送到Websocket:

def __init__(self):
    self.redis_publisher = RedisPublisher(facility='foo', broadcast=True)

def get(self, request):
    data_for_websocket = json.dumps({'some': 'data'})
    self.redis_publisher.publish_message(RedisMessage(data_for_websocket))

这段代码会在所有订阅(也就是正在监听)的Websocket上发布 data_for_websocket,使用的URL是:

ws://example.com/ws/foo?subscribe-broadcast

撰写回答