Django通道

2024-04-18 11:07:48 发布

您现在位置:Python中文网/ 问答频道 /正文

关于Django ets的小问题和应用程序。在谷歌服务让我进入聊天室,在那里人们可以连接并开始聊天。但我不知道一个用户如何向另一个用户发送即时消息。在

例如:

1)我把约翰添加到朋友中,想开始聊天。 2) 在服务器端,我可以生成objectroom,以我和John为成员。 3) 当我通过WebSocket向这个房间发送消息时,我知道这条消息是谁的,但我不知道如何获得John's channel

@channel_session_user_from_http
def ws_connect(message):
    rooms_with_user = Room.objects.filter(members=message.user)
    for r in rooms_with_user:
        Group('%s' % r.name).add(message.reply_channel)

@channel_session_user
def ws_receive(message):
    prefix, label = message['path'].strip('/').split('/')

    try:
        room = Room.objects.get(name=label)
    except Exception, e:
        room = Room.objects.create(name=get_random_string(30))
        for u in message.chmembers:
            room.members.add(u)
            # here can be somethis like this
            # try
            reply_channel = Channels.objects.get(online=True, user=u)
            Group('%s' % r.name).add(reply_channel)
    Group('%s' % room.name).send({
        "text": "%s : %s" % (message.user.username, message['text']),
    })

@channel_session_user
def ws_disconnect(message):
    prefix, label = message['path'].strip('/').split('/')
    Group(label).discard(message.reply_channel)

Tags: nameaddmessagegetobjectswssessiondef
1条回答
网友
1楼 · 发布于 2024-04-18 11:07:48

只需为用户对创建“自动唯一房间”。其余的保持不变。比如这样

def get_group_name(user1, user2):
    return 'chat-{}-{}'.format(*sorted([user1.id, user2.id]))

给它两个user对象,它将为这对用户返回一个唯一的房间,为User.id排序,类似于“chat-1-2”,用于User.id“1”和“2”的用户。在

一个用户和一个登录的用户之间仍然可以得到更多的消息。在

您可以从message.user获取经过身份验证的用户的对象。在

对于接收用户对象,我只发送了username以及消息。然后,您可以从message['text']中解压它,方法与解压实际消息的方式相同。在

^{pr2}$

这样,您就可以从示例中删除所有“room”内容,包括room表等,因为组名总是在两个用户之间发送消息时动态创建的。在


另一件重要的事情是:一个用户比另一个用户连接得晚,可能会错过初始消息。因此,当您连接时,您可能需要检查一些“chat_messages”数据库表,获取用户对之间最后10或20条消息,然后将这些消息发送回。这样用户就可以重温他们过去的对话。在

相关问题 更多 >