使用django-websocket-redis的异步Django
我正在尝试使用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