gpt4 book ai didi

python - 如何使用 django channel 和 websockets 从服务器的任何地方向客户端发送事件

转载 作者:行者123 更新时间:2023-12-04 13:31:26 29 4
gpt4 key购买 nike

现在我正在使用 django 和 angular 构建一个网站,并且我想在客户端和服务器之间添加 websocket 通信。
我按照 django channel 文档的说明进行操作。( https://channels.readthedocs.io/ )
我想从 django 服务器代码的任何地方发送任何事件。但是当多个用户通过套接字连接时,从服务器发送的数据总是到最后一个连接的用户。
这就是我所做的。
首先在consumers.py中,我如下定义了我的ChatConsumer类并添加了一个名为“tweet_send”函数的新处理程序

class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_name = self.scope['url_route']['kwargs']['room_name']
self.room_group_name = 'chat_%s' % self.room_name

# Join room group
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name
)

await self.accept()
...

# here's what I added a new tweet send handler
async def tweet_send(self, event):
content = event['content']
content["group_name"] = self.room_group_name

# Send message to WebSocket
await self.send(text_data=json.dumps({
"type": "MESSAGE",
"data": content
}))
在 django 服务器端的某个地方(在 serializers.py 中),当创建新推文时,我使用 django.channel_layer 向所有用户发送新推文数据
...
def create(self, validated_data):
...
new_tweet.save()

# send message via channels
channel_layer = get_channel_layer()
all_users = list(Member.objects.filter(is_active = True).values_list('id', flat = True))
for user_id in all_users:
async_to_sync(channel_layer.group_send)(
"chat_{}".format(user_id), # this is the group name of group name of individual users.
{ "type": "chat_message", "message": "tweet created" }
)
在 Angular websocket 服务中
init(userID: number): void{
if(this.ws){
this.ws.close();
}

this.ws = new WebSocket(`${environment.WEBSOCKET_URL}/chat/${userID}/`);
this.ws.onopen = () => {
this.currentWebSocketSubject.subscribe(data => {
if (data) {
this.ws?.send(JSON.stringify(data));
}
});
};

this.ws.onmessage = (event) => {
console.log("message arrived");
console.log(event);
if (event.data) {
const tempData: WS = JSON.parse(event.data) as WS;
switch (tempData.type) {
case 'MESSAGE':
console.log("message arrived");
console.log(tempData);
if (tempData.data) {
this.unreadMessages++;
this.messageSubject.next(tempData);
}
break;

}
}
};
}
当我测试这些代码时,我使用了两个客户端,两个客户端登录,并通过 websockets 成功连接到 django 服务器。
当我创建一条推文时,django 服务器使用 channel_layer.group_send 函数向每个 channel 发送事件,并且在 ChatConsumer 类中添加的“tweet_send”函数将事件发送给用户。
这些事件分别针对不同的用户。
但它们都被发送到最后一个 websocket 连接的用户。
我不知道为什么。请帮我。

最佳答案

我认为您必须使用 channel 3.0.0 并且发生此错误。我建议您将 channel 版本升级到 3.0.1 或 3.0.2。
然后错误就会消失。

关于python - 如何使用 django channel 和 websockets 从服务器的任何地方向客户端发送事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64835666/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com