我正在开发一个有房间的聊天应用程序。每个房间有两个用户。一个用户可以在多个房间中,即一个用户有多个房间。现在他正在一个房间里聊天。但他在另一个房间里收到了一条信息。我想把其他房间的消息通知给用户。我应该如何实现它?
目前建立的websocket连接是:ws://localhost:8000/chat/int<room_id>/
并将group_name命名为"room"+room_id。到目前为止,我做到了:
async def connect(self):
room_id = self.scope['url_route']['kwargs']['room_id']
await self.channel_layer.group_add(
"room"+room_id,
self.channel_name
)
await self.accept()
async def receive(self, text_data):
await self.channel_layer.group_send(
self.room_name,
{
'type': 'chat_message',
'message': json.loads(text_data)
}
)
async def chat_message(self, event):
await self.send(text_data=json.dumps({
'message': event['message']
}))Django 2.x django-channels 2.x python 3.6
发布于 2018-08-02 21:11:33
你至少需要两个型号的Message,MessageThread。当用户连接到套接字时,通道被添加到该用户所在的每个线程组中。您还必须将channel_name添加到用户会话中。
messaging/models.py
class MessageThread(models.Model):
title = models.CharField()
clients = models.ManyToManyField(User, blank=True)
class Message(models.Model):
date = models.DateField()
text = models.CharField()
thread = models.ForeignKey('messaging.MessageThread', on_delete=models.CASCADE)
sender = models.ForeignKey(User, on_delete=models.SET_NULL)
chat/consumers.py
class ChatConsumer(WebSocketConsumer):
def connect(self):
if self.scope['user'].is_authenticated:
self.accept()
# add connection to existing groups
for thread in MessageThread.objects.filter(clients=self.scope['user']).values('id'):
async_to_sync(self.channel_layer.group_add)(thread.id, self.channel_name)
# store client channel name in the user session
self.scope['session']['channel_name'] = self.channel_name
self.scope['session'].save()
def disconnect(self, close_code):
# remove channel name from session
if self.scope['user'].is_authenticated:
if 'channel_name' in self.scope['session']:
del self.scope['session']['channel_name']
self.scope['session'].save()
async_to_sync(self.channel_layer.group_discard)(self.scope['user'].id, self.channel_name)发布于 2018-08-01 04:18:48
我做了类似的事情,你可以尝试这样做:
connect(message):
// however you get your chatroom value from the socket
Group("%s" % chatroom).add(message.reply_channel)
message(message):
message = json.loads(message.content['text'])
chatroom = message['chatroom']
Group("%s" % chatroom).send({
"text": json.dumps({
"id": "newuser",
"username": message['username'],
"message": message['message']
})
})我可能误解了你的问题。也许更像这样:
为每个用户创建一个唯一的id,并使用该值作为‘聊天室’,然后发送每个消息与聊天室号码和用户号码,它应该去。Django可以解释用户id并将消息发送到正确的通道,然后让Javascript解释消息和房间号以将它们带到正确的页面?
这是一个有趣的想法
发布于 2019-09-11 13:32:15
(想法:)我打开了两个套接字:
然后,对于从第一个解释的通道(上面)中的任何用户收到的每条消息,我都会向这两个套接字发送适当的回复。
示例在这里:chatroom.subtionary.com (只需点击一个聊天室并通过电子邮件进入)它还可以重新排序聊天室列表和脉冲元素,还可以在元素下写入每个聊天室的最后一条消息,还可以享受回复和删除选项!!
(我知道这是最懒惰的方法,但效果很好)
https://stackoverflow.com/questions/51599270
复制相似问题