Django 实现 Websocket 广播、点对点发送消息的代码
1.Django实现Websocket
使用Django来实现Websocket服务的方法很多在这里我们推荐技术最新的Channels库来实现
1.1.安装DjangoChannels
Channels安装如果你是Windows操作系统的话,那么必要条件就是Python3.7
pipinstallchannels
1.2.配置DjangoChannels
1.创建项目ChannelsReady
django-adminstartprobjectChannelsReady
2.在项目的settings.py同级目录中,新建文件routing.py
#routing.py fromchannels.routingimportProtocolTypeRouter application=ProtocolTypeRouter({ #暂时为空 })
3.在项目配置文件settings.py中写入
INSTALLED_APPS=[ 'channels' ] ASGI_APPLICATION="ChannelsReady.routing.application"
1.3.启动带有Channels提供的ASGI的Django项目
Youhave17unappliedmigration(s).Yourprojectmaynotworkproperlyuntilyouapplythemigrationsforapp(s):admin,auth,contenttypes,sessions.
Run'pythonmanage.pymigrate'toapplythem.
February01,2020-17:27:13
Djangoversion3.0.2,usingsettings'ChannelsReady.settings'
StartingASGI/Channelsversion2.4.0developmentserverathttp://0.0.0.0:8000/
QuittheserverwithCTRL-BREAK.
很明显可以看到ASGI/Channels,这样就算启动完成了
1.4.创建Websocket服务
1.创建一个新的应用chats
pythonmanage.pystartappchats
2.在settings.py中注册chats
INSTALLED_APPS=[ 'chats', 'channels' ]
3.在chats应用中新建文件chatService.py
fromchannels.generic.websocketimportWebsocketConsumer #这里除了WebsocketConsumer之外还有 #JsonWebsocketConsumer #AsyncWebsocketConsumer #AsyncJsonWebsocketConsumer #WebsocketConsumer与JsonWebsocketConsumer就是多了一个可以自动处理JSON的方法 #AsyncWebsocketConsumer与AsyncJsonWebsocketConsumer也是多了一个JSON的方法 #AsyncWebsocketConsumer与WebsocketConsumer才是重点 #看名称似乎理解并不难Async无非就是异步带有async/await #是的理解并没有错,但对与我们来说他们唯一不一样的地方,可能就是名字的长短了,用法是一模一样的 #最夸张的是,基类是同一个,而且这个基类的方法也是Async异步的 classChatService(WebsocketConsumer): #当Websocket创建连接时 defconnect(self): pass #当Websocket接收到消息时 defreceive(self,text_data=None,bytes_data=None): pass #当Websocket发生断开连接时 defdisconnect(self,code): pass
1.5.为Websocket处理对象增加路由
1.在chats应用中,新建urls.py
fromdjango.urlsimportpath fromchats.chatServiceimportChatService websocket_url=[ path("ws/",ChatService) ]
2.回到项目routing.py文件中增加ASGI非HTTP请求处理
fromchannels.routingimportProtocolTypeRouter,URLRouter fromchats.urlsimportwebsocket_url application=ProtocolTypeRouter({ "websocket":URLRouter( websocket_url ) })
总结:
- 下载
- 注册到setting.py里的app
- 在setting.py同级的目录下注册channels使用的路由----->routing.py
- 将routing.py注册到setting.py
- 把urls.py的路由注册到routing.py里
- 编写wsserver.py来处理websocket请求
3.广播消息
3.1客户端保持不变,同时打开多个客户端
3.2服务端存储每个链接的对象
socket_list=[] classChatService(WebsocketConsumer): #当Websocket创建连接时 defconnect(self): self.accept() socket_list.append(self) #当Websocket接收到消息时 defreceive(self,text_data=None,bytes_data=None): print(text_data)#打印收到的数据 forwsinsocket_list:#遍历所有的WebsocketConsumer对象 ws.send(text_data)#对每一个WebsocketConsumer对象发送数据
4.点对点消息
4.1客户端将用户名拼接到url,并在发送的消息里指明要发送的对象
4.2服务端存储用户名以及websocketConsumer,然后给对应的用户发送信息
fromchannels.generic.websocketimportWebsocketConsumer user_dict={} list=[] importjson classChatService(WebsocketConsumer): #当Websocket创建连接时 defconnect(self): self.accept() username=self.scope.get("url_route").get("kwargs").get("username") user_dict[username]=self print(user_dict) #list.append(self) #当Websocket接收到消息时 defreceive(self,text_data=None,bytes_data=None): data=json.loads(text_data) print(data) to_user=data.get("to_user") message=data.get("message") ws=user_dict.get(to_user) print(to_user) print(message) print(ws) ws.send(text_data) #当Websocket发生断开连接时 defdisconnect(self,code): pass
总结
到此这篇关于Django实现Websocket广播、点对点发送消息的文章就介绍到这了,更多相关Django实现Websocket广播、点对点发送消息内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!