2016-08-10 55 views
5

Django Kanalları, WebKontrolleri ve sohbet uygulamaları hakkında çok az soru var. Google ile hizmet vermek, kullanıcıların sohbet edebileceği ve sohbet edebilecekleri sohbet odalarına yönlendirir. Ancak bir kullanıcının başka bir kullanıcı anlık mesajını nasıl gönderebileceğini bilmiyorum. ÖrneğinDjango Kanalları

:

1) arkadaşlara John ekleyin ve sohbet başlatmak istiyoruz. 2) Sunucu tarafında, benimle ve John ile üye olarak nesne Odası oluşturabilirim. 3) Bu odaya WebSocket'e aracılığıyla mesaj gönderdiğinizde, bu mesajı kim için biliyorum ama Basitçe kullanıcı için "otomatik eşsiz odalar" make John'un kanalını

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

cevap

6

nasıl bilmiyorum çiftleri. Gerisi aynı kalır. Bu

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

gibi Örneğin o iki kullanıcı nesneleri verin ve o, kullanıcıların bu çifti için eşsiz bir yer döndürür sipariş User.id, User.id "1" olan kullanıcılar için "sohbet-1-2" gibi bir şey ve 2".

Bu şekilde, bir kullanıcı, birden fazla oturum açmış cihazla bağlantı kurabilir ve yine de iki kullanıcı arasında gönderilen iletileri alabilir.

Kimliği doğrulanmış kullanıcının nesnesini message.user'dan alabilirsiniz.

Alıcı kullanıcı nesnesi için, iletiyle birlikte username gönderdim. Ardından, asıl mesajın paketini açtığınız şekilde message['text']'dan açabilirsiniz.

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 ... 

Yani bu fikre, bir mesajı iki kullanıcı arasında göndermek olduğunda grup adları her zaman on-the-fly oluşturulan Çünkü vb room masaya dahil, örneğin tüm "oda" şeyleri bırakın.


Başka önemli bir şey: Bir kullanıcı diğer kullanıcıdan daha sonra bağlanır ve ilk iletileri özleyebilir. Bağlandığınızda, muhtemelen "chat_messages" veritabanı tablosunu kontrol etmek, kullanıcı çifti arasındaki son 10 veya 20 mesajı almak ve bunları geri göndermek isteyebilirsiniz. Böylece kullanıcılar geçmiş konuşmalarını yakalayabilirler.