6

Django チャネル、WebSocket、およびチャット アプリケーションについては、ほとんど疑問がありません。Google でサービスを提供すると、人々が接続してチャットを開始できるチャットルームにアクセスできます。しかし、あるユーザーが別のユーザーにインスタント メッセージを送信する方法がわかりません。

例えば:

1) ジョンを友達に追加し、チャットを開始したい。2) サーバー側では、私と John をメンバーとしてオブジェクト Room を生成できます。3) WebSocket 経由でこの部屋にメッセージを送信すると、このメッセージが誰宛のものかはわかりますが、 John のチャネルを取得する方法がわかりません。

@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)
4

1 に答える 1

12

ユーザーペアの「自動ユニークルーム」を作るだけ。残りは同じままです。たとえば、このように

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

2 つのユーザー オブジェクトを指定すると、"1" と "2"User.idを持つユーザーの場合は "chat-1-2" のように、注文されたそのユーザーのペアに固有のルームが返されます。User.id

このようにして、ユーザーは複数のログイン デバイスに接続し、2 人のユーザー間で送信されたメッセージを取得できます。

から認証済みユーザーのオブジェクトを取得できますmessage.user

受信ユーザー オブジェクトについてはusername、メッセージと共に を送信しました。次にmessage['text']、実際のメッセージを解凍するのと同じ方法で解凍できます。

payload = json.loads(message.content['text'])
msg = payload['msg']
sender = message.user
receiver = get_object_or_404(User, username=payload['receiver'])
# ... here you could check if they have required permission ...
group_name = get_group_name(sender, receiver)
response = {'msg': msg}
Group(group_name).send({'text': json.dumps(response)})
# ... here you could persist the message in a database ...

これにより、テーブルなどを含むすべての「部屋」のものを例から削除できroomます。グループ名は、2 人のユーザー間でメッセージが送信されるときに常にオンザフライで作成されるためです。


もう 1 つの重要な点: 1 人のユーザーが他のユーザーよりも遅く接続し、最初のメッセージを見逃す可能性があります。したがって、接続するときは、おそらく「chat_messages」データベース テーブルをチェックし、ユーザー ペア間の最後の 10 または 20 メッセージを取得して、それらを送り返したいと思うでしょう。そのため、ユーザーは過去の会話に追いつくことができます。

于 2016-08-14T08:52:01.580 に答える