Django配置WebSocket:django3配置websocket步骤
一、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、测试网站
服务器地址
ws://127.0.0.1:8888/chat/socket/
