当前位置: 首页 > news >正文

django中配置使用websocket

Django 默认情况下并不支持 WebSocket,但你可以通过集成第三方库如 channels 来实现 WebSocket 功能。channels 是一个 Django 应用,它提供了对 WebSocket、HTTP2 和其他协议的支持。

下面是如何在 Django 项目中使用 WebSocket 的基本步骤:

一:安装 channels
首先,你需要安装 channels 和 channels-redis(用于消息传递):

pip install channels channels-redis

二:配置项目
在你的 settings.py 中,添加以下配置:

# INSTALLED_APPS  

INSTALLED_APPS = [  

    # ...  

    'channels',  

]  

  

# Channels 配置  

ASGI_APPLICATION = 'your_project.routing.application'  

  

# Channels layers 配置  

CHANNEL_LAYERS = {  

    'default': {  

        'BACKEND': 'channels_redis.core.RedisChannelLayer',  

        'CONFIG': {  

            "hosts": [('127.0.0.1', 6379)],  

        },  

    },  

}

三:创建路由
在 your_project 目录下创建一个名为 routing.py 的文件,并添加以下内容

from django.urls import path  

from your_app.consumers import YourConsumer  

  

websocket_urlpatterns = [  

    path('ws/your-path/', YourConsumer.as_asgi()),  

]

四:创建 Consumer

在你的应用中创建一个名为 consumers.py 的文件,并添加一个Consumer

from channels.generic.websocket import AsyncWebsocketConsumer  

import json  

  

class YourConsumer(AsyncWebsocketConsumer):  

    async def connect(self):  

        # 当 WebSocket 连接建立时,此方法会被调用  

        await self.accept()  

  

    async def disconnect(self, close_code):  

        # 当 WebSocket 连接关闭时,此方法会被调用  

        pass  

  

    async def receive(self, text_data=None, bytes_data=None):  

        # 当从客户端接收到消息时,此方法会被调用  

        data = json.loads(text_data)  

        # 处理接收到的数据  

        pass  

  

    async def your_custom_method(self, data):  

        # 你可以定义自己的方法来处理特定逻辑  

        # 然后从其他地方调用这个方法  

        pass  

  

    async def send_message_to_client(self, message):  

        # 发送消息给客户端  

        await self.send(text_data=json.dumps(message))

五:前端连接 WebSocket

在前端,你可以使用原生的 WebSocket API 或其他库(如 socket.io)来连接你的 WebSocket 服务。以下是一个使用原生 API 的示例

const ws = new WebSocket('ws://your-domain/ws/your-path/');  

  

ws.onopen = function(event) {  

    console.log("WebSocket 已连接");  

    ws.send(JSON.stringify({ your_data: 'here' }));  

};  

  

ws.onmessage = function(event) {  

    const data = JSON.parse(event.data);  

    console.log("接收到数据:", data);  

};  

  

ws.onclose = function(event) {  

    console.log("WebSocket 已关闭");  

};  

  

ws.onerror = function(error) {  

    console.error("WebSocket 错误:", error);  

};

六:运行项目
使用 Daphne 或 Daphne + Runserver 运行你的项目:

daphne your_project.asgi:application

或python manage.py runserver

相关文章:

  • 009集——磁盘详解——电脑数据如何存储在磁盘
  • 第8讲项目整合SpringSecurity
  • Qt:自定义信号,信号emit,传参问题,信号槽与moc
  • 蓝桥杯刷题--python-6
  • 【后端高频面试题--Nginx篇】
  • OpenCV-36 多边形逼近与凸包
  • 【C++】C++11上
  • OCP的operator——(4)用户任务:使用Operator创建etcd集群
  • ubuntu屏幕小的解决办法
  • ES实战--集群扩展
  • 专业140+总分420+东北大学841通信专业基础考研经验东大电子信息与通信工程,真题,大纲,参考书。
  • 【Spring面试题】
  • 跟着pink老师前端入门教程-day26
  • Acwing语法基础课 8.STL(笔记)
  • 【sgCreateTableColumn】自定义小工具:敏捷开发→自动化生成表格列html代码(表格列生成工具)[基于el-table-column]
  • Akka系列(七):Actor持久化之Akka persistence
  • PAT A1120
  • PHP面试之三:MySQL数据库
  • Redis 中的布隆过滤器
  • Vue ES6 Jade Scss Webpack Gulp
  • 编写高质量JavaScript代码之并发
  • 大数据与云计算学习:数据分析(二)
  • 回顾2016
  • 解析带emoji和链接的聊天系统消息
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 如何编写一个可升级的智能合约
  • 手写双向链表LinkedList的几个常用功能
  • 我建了一个叫Hello World的项目
  • 物联网链路协议
  • 阿里云服务器购买完整流程
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​比特币大跌的 2 个原因
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (day6) 319. 灯泡开关
  • (function(){})()的分步解析
  • (安卓)跳转应用市场APP详情页的方式
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (十八)三元表达式和列表解析
  • (转)shell调试方法
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .Net7 环境安装配置
  • .NET命名规范和开发约定
  • .net中调用windows performance记录性能信息
  • /var/lib/dpkg/lock 锁定问题
  • @Import注解详解
  • []常用AT命令解释()
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [20161101]rman备份与数据文件变化7.txt
  • [20180129]bash显示path环境变量.txt
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [C++]C++类基本语法
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解