2016-08-10 89 views
5

我對Django頻道,WebSockets和聊天應用程序沒有什麼疑問。用谷歌服務讓我到聊天室,人們可以在那裏連接並開始聊天。但我不知道一個用戶可以發送另一個用戶即時消息。Django頻道

例如:

1)我給朋友添加約翰,並且想開始聊天。 2)在服務器端,我可以生成對象房間,以我和約翰爲成員。 3)當我通過WebSocket的發送消息給這個房間,我知道這個消息是誰,但我不知道怎麼去約翰的通道

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

回答

6

簡單地讓「自動獨特的客房」用戶對。其餘的保持不變。例如像這樣

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

給它兩個用戶對象,並將其返回該對用戶獨特的房間,下令User.id,像「聊天-1-2」,爲用戶提供User.id「1」和「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表等等。因爲集團的名字總是在即時創建時的消息是兩個用戶之間發送。


另一個重要的事情:一個用戶將比另一個用戶連接晚,並可能錯過初始消息。因此,當你連接時,你可能想檢查一些「chat_messages」數據庫表,獲取用戶對之間的最後10或20條消息,並將它們發回。因此用戶可以趕上他們過去的談話。