前言
因为项目需要,需要做一个前后实时通讯,轮询方式因为python 的效率实在拉跨所以改为websocket方式阿里独立使用前后实时通讯.为了保证http和websocket同时有效,找了好多帖子,不过发现好多帖子都用不了,环境卡死了,好在成功了,记录一下
项目环境需求
python3.9 django 3.2 channels 3.0.3
因为项目需要,不能更改
安装配置项目
安装channels
pip install channels
配置channels
1.转到项目 setting.py文件,在INSTALLED_APPS添加channels
2.在setting.py文件尾部添加 ASGI配置 ASGI_APPLICATION = 'yourprojectsname.routing.application’
3.在setting.py同级目录下创建routing.py文件并添加如下内容from channels.routing import ProtocolTypeRouter, URLRouter from yourwebsocketapp.routing import websocket_url application = ProtocolTypeRouter({ # 暂时为空 "websocket": URLRouter( websocket_url ) })
注
yourwebsocketapp 是即将创建的django app,现在还不能直接启动django
创建、配置yourwebsocketapp
创建django app
django-admin startapp yourwebsocketappname
创建routing.py文件
导入以下代码from django.urls import path from .consumers import ChatService websocket_url = [ path("ws", ChatService) ]
ws是websocket访问路径,ChatService是websocket访问时执行的方法
创建consumers.py文件
当如以下代码import json from channels.consumer import AsyncConsumer class ChatService(AsyncConsumer): async def websocket_connect(self, event): await self.send({ "type": "websocket.accept", }) async def websocket_receive(self, event): await self.send({ "type": "websocket.send", "text": json.dumps({"data": event["text"]}), }) async def websocket_disconnect(self, event): await self.send({ "type": "websocket.send", "text": json.dumps({"data": event["text"]}), })
注
由于关闭通道时没有找到方法,所以用了send方法代替,如果希望有懂的小伙伴看到可以帮我一下
启动项目
启动项目项目后如下图就是成功了,
在浏览器控制台输入如下测试代码得到下图显示则websocket配置完毕
ws=new WebSocket('ws://192.168.2.2:8000/ws')
ws.onmessage = event => console.log(event.data)
ws.send("ping")
控制台如下图显示
django控制台打印如下图显示
好啦,这就是我的所有分享,记得项目名字和app名字替换成自己的