简单可以认为是在web上实现socket功能,在服务器上与浏览器保持socket长连接。
实现websocket是通过magic string
解释器:python3.9
django==3.2
channels==3.0.4 #有些时候是channels版本有问题,导致配置不生效
test_websocket
--chat
--routings.py
--consumers.py
--test_websocket
--settings.py
--asgi.py
--manage.py
#1、注册应用和channels
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'chat.apps.ChatConfig', #注册chat应用
'channels', #注册channels
]
#2、添加ASGI_APPLICATION
ASGI_APPLICATION = 'test_websocket.asgi.application'
将所有的websocket的请求都放到这个应用中
1、在consumers.py中增加处理websocket请求的类
from channels.generic.websocket import WebsocketConsumer
from channels.exceptions import StopConsumer
from asgiref.sync import async_to_sync
import time
class ChatView(WebsocketConsumer):
def websocket_connect(self, message):
#客户端与服务端进行握手时,会触发这个方法
#服务端允许客户端进行连接,就是握手成功
self.accept()
def websocket_receive(self, message):
#接收到客户端发送的数据
recv = message.get('text')
print('接收到的数据,',recv)
if recv == 'close':
#服务的主动断开连接
print('服务器断开连接')
self.close()
else:
#客户端向服务端发送数据
self.send(f'我收到了,{time.strftime("%Y-%m-%d %H:%M:%S")}')
def websocket_disconnect(self, message):
#客户端端口连接时,会触发该方法,断开连接
print('客户端断开连接')
raise StopConsumer()
2、在routings.py增加websocket路由
from django.urls import path
from . import consumers
#这个变量是存放websocket的路由
socket_urlpatterns = [
path('chat/socket/',consumers.ChatView.as_asgi()),
]
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter,URLRouter
#导入chat应用中的路由模块
from chat import routings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_websocket.settings')
application = ProtocolTypeRouter({
#http路由走这里
"http":get_asgi_application(),
#chat应用下rountings模块下的路由变量socket_urlpatterns
"websocket":URLRouter(routings.socket_urlpatterns)
})
python manage.py runserver 0.0.0.0:8888
看到有这个,就是配置成功了
1、测试网站
EasySwoole-WebSocket在线测试工具
服务器地址
ws://127.0.0.1:8888/chat/socket/