Loading

6.channels 配置websocket

 
Django默认不支持websockey,需要Django支持的话需要安装第三方组件
django channels 是django支持websocket的一个模块。
 
1.安装
pip3 install channels # 安装
 
 
2.settings.py配置
 
#INSTALLED_APPS 中注册channels
 INSTALLED_APPS = (
     'channels',
 )
 
 
#添加ASGI支持websocket ,指向项目下asgi文件的application
ASGI_APPLICATION = "demo.asgi.application"
 
3.修改asgi文件
 
import os

from django.core.asgi import get_asgi_application

from channels.routing import ProtocolTypeRouter, URLRouter
from WebSocketPretty import routing

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DemoName.settings') # 添加项目配置

# application = get_asgi_application() 只支持http,注释掉该行

# 既支持http又支持websocket
application = ProtocolTypeRouter(
    {'http': get_asgi_application(),  # 自动找urls.py  视图函数 - > http请求
     'websocket': URLRouter(routing.websocket_urlpatterns)  # routing 相当于urls.py 路由
     }
)
 
 
4.在app下创建routing.py (ws主路由)
Channels路由配置类似于Django URLconf,当通道服务器接收到HTTP请求时,它告诉通道运行什么代码。
在app目录下,创建一个文件 routing.py文件
from django.urls import path

from WebSocketPretty import consumers #consumers相当于ws视图

websocket_urlpatterns = [
    # 请求地址匹配ws/ ,走websocket视图处理
    path('ws/',consumers.ChatConsumer.as_asgi())
]
 
5.在app下创建consumers.py 文件
from channels.generic.websocket import WebsocketConsumer
from channels.exceptions import StopConsumer


class ChatConsumer(WebsocketConsumer):

    def websocket_connect(self, message):
        # 有客户端向后端发送websocket连接的请求时,自动触发

        self.accept()  # 服务端允许和客户端创建连接

    def receive(self, text_data=None, bytes_data=None):
        # text_data 是前端向后端发送数据,自动触发接收消息
        print(text_data)
        # send 是后端向前端发送数据
        self.send('ok')

    def websocket_disconnect(self, message):
        # 客户端与服务端断开连接时,自动触发
        raise StopConsumer
 
 
 
 

posted @ 2022-05-22 20:15  木子七  阅读(169)  评论(0编辑  收藏  举报