moo*_*hel 5 python django chat django-channels
我对Django频道,WebSockets和聊天应用程序一无所知.与谷歌一起服务让我去聊天室,在那里人们可以连接并开始聊天.但我不知道一个用户如何发送另一个用户即时消息.
例如:
1)我将John添加到朋友,并希望开始聊天.2)在服务器端,我可以生成对象Room,我和John作为成员.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)
Run Code Online (Sandbox Code Playgroud)
只需为用户对设置"自动独特房间".其余的保持不变.比如这样
def get_group_name(user1, user2):
return 'chat-{}-{}'.format(*sorted([user1.id, user2.id]))
Run Code Online (Sandbox Code Playgroud)
给它两个用户对象,它为这对用户返回一个独特的空间,为"1"和"2" 的用户订购User.id"chat-1-2 User.id".
这样,用户可以连接多个登录设备,并仍然可以获得两个用户之间发送的消息.
您可以从中获取经过身份验证的用户的对象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 ...
Run Code Online (Sandbox Code Playgroud)
因此,您可以从示例中删除所有"空间"内容,包括room表格等.因为在两个用户之间发送消息时,总是会立即创建组名称.
另一个重要的事情:一个用户将比其他用户晚连接,并可能错过初始消息.因此,当您连接时,您可能想要检查一些"chat_messages"数据库表,获取用户对之间的最后10或20条消息,然后将其发回.因此,用户可以赶上他们过去的谈话.
| 归档时间: |
|
| 查看次数: |
1259 次 |
| 最近记录: |