- 演示及源码地址:
演示地址:https://www.wchime.xyz/#/
后端代码:https://gitee.com/mom925/wchime-web-api
前端代码:https://gitee.com/mom925/uniapp-web
- 项目说明
项目技术:django+mysql+uwsgi+nginx+uniapp
逻辑:以django搭建一个websocket服务器,前端用户连接websocket,进入同一群聊实现在线实时聊天
演示图:
- 主要代码说明
搭建websocket代码
from channels.generic.websocket import WebsocketConsumer from channels.exceptions import StopConsumer from asgiref.sync import async_to_sync import json class RollCallConsumer(WebsocketConsumer): def websocket_connect(self, message): # 接收这个客户端的连接 self.accept() # 将这个客户端的连接对象加入到某个地方(内存 or redis)1314 是群号这里写死了 async_to_sync(self.channel_layer.group_add)('1314', self.channel_name) def websocket_receive(self, message): # 浏览器基于websocket向后端发送数据,自动触发接收消息 # data = json.loads(message['text']) # chat_type = data.get('chat_type') # chat_id = data.get('chat_id') # chat_content = data.get('message') # print('chat_type', chat_type) # if chat_type == 'add_chat': # async_to_sync(self.channel_layer.group_add)(chat_id, self.channel_name) # 通知组内的所有客户端,执行 chat_message 方法,在此方法中自己可以去定义任意的功能。 async_to_sync(self.channel_layer.group_send)('1314', {"type": 'chat.message', 'message': message}) # 这个方法对应上面的type,意为向1314组中的所有对象发送信息 # 回调的方法 def chat_message(self, event): text = event['message']['text'] self.send(text) def websocket_disconnect(self, message): data = json.loads(message['text', '{}']) chat_id = data.get('chat_id') # 断开链接要将这个对象从 channel_layer 中移除 async_to_sync(self.channel_layer.group_discard)(chat_id, self.channel_name) raise StopConsumer()
django项目此时需要以asgi启动websocket,部署后可用daphne启动asgi