Django4+webSocket

配置Django

pip install channels daphne

注册app

修改settings.py

INSTALLED_APPS = [
    'daphne',   #注册daphne组件,在channels4.0开始,注册组件使用daphne,一定放在开头
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

#添加该选项,表示django以asgi的模式启动
ASGI_APPLICATION = 'webSocket.asgi.application'

 wsgi:django默认启动模式,wsgi只支持同步处理请求,即http请求

asgi:该模式下支持wsgi,并且新增了异步请求和webSocket

在指定目录下创建routings.py、consumers.py

consumers.py

类似于视图views.py,创建用于socket处理的类

from channels.exceptions import StopConsumer
from channels.generic.websocket import WebsocketConsumer


class ChatConsumer(WebsocketConsumer):
    def websocket_connect(self, message):
        '''
        当有客户端向后端发送websocket连接请求时,自动触发该函数
        :param message:
        :return:
        '''
        # 服务器允许客户端创建连接
        self.accept()


    def websocket_receive(self, message):
        '''
        浏览器基于websocket向后端发送数据,自动触发接受消息,并且处理信息
        :param message:
        :return:
        '''
        # 输出消息
        print(message)
        #服务端向前端回消息
        self.send('服务器收到了你的消息:%s' % (message['text']))

    def websocket_disconnect(self, message):
        '''
        客户端与服务端断开连接时,自动触发该函数
        :param message:
        :return:
        '''
        print('断开连接')
        raise StopConsumer()

 routings.py

与urls.py功能类似,当接受到客户发来的socket请求时,使用哪个类socket类进行处理

from django.urls import  re_path, path
from app.consumers import ChatConsumer
websocket_urlpatterns = [
    path('room/',ChatConsumer)
    #也可以使用正则路径,这种方式用在群组通信当中
    re_path('ws/chat/(?P<group>\w+)/$',ChatConsumer)
]

修改asgi.py

import os
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
from . import routings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webSocket.settings')

# 支持http请求和websocket请求
application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": URLRouter(routing.websocket_urlpatterns)
})

使用浏览器的console进行简单测试

#创建websocket
var socket = new WebSocket('ws://127.0.0.1:8000/room/')
#定义收到服务器消息之后如何处理
socket.onmessage = function(e){console.log(e.data)}
#向服务器发送消息
socket.send('你好')

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值