一、websocket概述
简单可以认为是在web上实现socket功能,在服务器上与浏览器保持socket长连接。
实现websocket是通过magic string
二、环境概述
解释器:python3.9
django==3.2
channels==3.0.4 #有些时候是channels版本有问题,导致配置不生效
三、配置步骤
3.1、项目结构
test_websocket
--chat
--routings.py
--consumers.py
--test_websocket
--settings.py
--asgi.py
--manage.py
3.2、修改settings.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'3.3、修改chat应用
将所有的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()),
]3.4、修改asgi.py文件
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)
})3.5、启动项目
python manage.py runserver 0.0.0.0:8888

看到有这个,就是配置成功了
四、测试
1、测试网站
EasySwoole-WebSocket在线测试工具
服务器地址
ws://127.0.0.1:8888/chat/socket/



















