使用Django Channels实现WebSocket实时通信

💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

使用Django Channels实现WebSocket实时通信

      • Django Channels 简介
      • 环境搭建
        • 安装 Django 和 Channels
      • 创建 Django 项目
      • 配置 ASGI
      • 编写消费者
      • 配置路由
      • 创建模板
      • 创建视图
      • 配置 URL
      • 运行开发服务器
      • 测试 WebSocket 连接
      • 总结

Django Channels 是 Django 的一个扩展,允许 Django 处理非 HTTP 协议,如 WebSocket。本文将详细介绍如何使用 Django Channels 实现 WebSocket 实时通信,包括环境搭建、项目结构、安装 Channels、配置 ASGI、编写消费者、运行开发服务器、测试 WebSocket 连接等内容。

Django Channels 简介

Django Channels 是一个 Django 扩展,它将 Django 从仅处理 HTTP 请求扩展到处理多种协议,特别是 WebSocket。通过 Channels,你可以实现实时功能,如聊天应用、实时通知等。

环境搭建

在开始之前,确保你的环境中已安装 Python 和 pip。
安装 Django 和 Channels
pip install django channels

创建 Django 项目

使用 Django 命令行工具创建一个新的项目。

django-admin startproject myproject

进入项目目录并创建一个新的应用。

cd myproject
django-admin startapp chat

配置 ASGI

myproject/settings.py 中添加 channelsINSTALLED_APPS

INSTALLED_APPS = [# ...'channels','chat',
]

myproject/asgi.py 中配置 ASGI。

import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
import chat.routingos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')django_asgi_app = get_asgi_application()application = ProtocolTypeRouter({'http': django_asgi_app,'websocket': AuthMiddlewareStack(URLRouter(chat.routing.websocket_urlpatterns)),
})

编写消费者

chat/consumers.py 中定义 WebSocket 消费者。

import json
from channels.generic.websocket import AsyncWebsocketConsumer累加器 = 0class ChatConsumer(AsyncWebsocketConsumer):async def connect(self):self.room_name = self.scope['url_route']['kwargs']['room_name']self.room_group_name = f'chat_{self.room_name}'# 加入房间组await self.channel_layer.group_add(self.room_group_name,self.channel_name)await self.accept()async def disconnect(self, close_code):# 退出房间组await self.channel_layer.group_discard(self.room_group_name,self.channel_name)# 接收来自 WebSocket 的消息async def receive(self, text_data):text_data_json = json.loads(text_data)message = text_data_json['message']# 向房间组发送消息await self.channel_layer.group_send(self.room_group_name,{'type': 'chat_message','message': message})# 从房间组接收消息并发送给 WebSocketasync def chat_message(self, event):message = event['message']# 发送消息给 WebSocketawait self.send(text_data=json.dumps({'message': message}))

配置路由

chat/routing.py 中定义 WebSocket 路由。

from django.urls import re_path
from . import consumerswebsocket_urlpatterns = [re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer.as_asgi()),
]

创建模板

chat/templates/chat/room.html 中创建 WebSocket 客户端模板。

<!DOCTYPE html>
<html>
<head><title>Chat Room</title><script src="https://cdn.socket.io/4.0.0/socket.io.min.js"></script><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body><h1>Chat Room {{ room_name }}</h1><ul id="chat-log"></ul><input id="chat-message-input" type="text" size="100"><button id="chat-message-submit">Send</button><script>const roomName = '{{ room_name }}';const socket = new WebSocket(`ws://${window.location.host}/ws/chat/${roomName}/`);socket.onmessage = function(e) {const data = JSON.parse(e.data);const item = document.createElement('li');item.textContent = data.message;document.getElementById('chat-log').appendChild(item);};document.getElementById('chat-message-submit').onclick = function(e) {const messageInputDom = document.getElementById('chat-message-input');const message = messageInputDom.value;socket.send(JSON.stringify({'message': message}));messageInputDom.value = '';};</script>
</body>
</html>

创建视图

chat/views.py 中创建视图。

from django.shortcuts import renderdef room(request, room_name):return render(request, 'chat/room.html', {'room_name': room_name})

配置 URL

chat/urls.py 中配置 URL 路由。

from django.urls import path
from . import viewsurlpatterns = [path('<str:room_name>/', views.room, name='room'),
]

运行开发服务器

启动 Django 开发服务器。

python manage.py runserver

测试 WebSocket 连接

打开浏览器,访问 http://127.0.0.1:8000/chat/room_name/,其中 room_name 是你选择的房间名称。你应该能够看到聊天室页面,并且可以发送和接收消息。

总结

通过本文,你已经学习了如何使用 Django Channels 实现 WebSocket 实时通信。我们介绍了 Django Channels 的基本概念、环境搭建、项目结构、安装 Channels、配置 ASGI、编写消费者、运行开发服务器、测试 WebSocket 连接等内容。掌握了这些知识,将有助于你在实际工作中更好地利用 Django Channels 来构建实时功能,如聊天应用、实时通知等。
Django Channels 项目结构示例

使用 Django Channels 可以轻松实现 WebSocket 实时通信功能。
WebSocket 实时通信示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/462337.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA 笔记】11 ch08_opp_intermediate 第8章 面向对象编程(中级部分)

第8章 面向对象编程(中级部分) IDEA 常用快捷键 包 包的三大作用 包基本语法 包的本质分析 包的命名 常用的包 如何引入包 注意事项和使用细节 访问修饰符 基本介绍 访问修饰符的访问范围! 使用的注意事项 面向对象编程三大特征 基本介绍 封装介绍 封装的理解和好处 封装的实现…

面试题:JVM(四)

new对象流程&#xff1f;&#xff08;龙湖地产&#xff09; 对象创建方法&#xff0c;对象的内存分配。&#xff08;360安全&#xff09; 1. 对象实例化 创建对象的方式有几种&#xff1f; 创建对象的步骤 指针碰撞&#xff1a;以指针为分界线&#xff0c;一边是已连续使用的…

无人机螺旋桨动平衡分析测试台

产品简介 Flight Stand系列动力测试台全部支持螺旋桨动平衡分析测试功能&#xff0c;用户仅需几个简单的操作步骤&#xff0c;轻松实现电机和螺旋桨ISO 21940-11:2016标准级的动平衡精度。 功能说明 测试台一体化集成有三坐标振动传感器和转速传感器&#xff0c;通过测量动力…

qt QTextEdit详解

QTextEdit是Qt框架中的一个文本编辑控件类&#xff0c;它提供了丰富的功能用于编辑和显示纯文本以及富文本。 重要方法 setPlainText(const QString &text)&#xff1a;设置纯文本内容。toPlainText()&#xff1a;获取纯文本内容。setHtml(const QString &text)&#…

杂项——USB键盘与鼠标流量分析——BUUCTF——流量分析

第一次做USB键盘与鼠标流量分析的题目&#xff0c;现在来好好做一个总结 1. 基础知识 USB流量指的是USB设备接口的流量&#xff0c;攻击者能够通过监听usb接口流量获取键盘敲击键、鼠标移动与点击、存储设备的铭文传输通信、USB无线网卡网络传输内容等等。 在正式介绍 USB H…

Windows部署rabbitmq

本次安装环境&#xff1a; 系统&#xff1a;Windows 11 软件建议版本&#xff1a; erlang OPT 26.0.2rabbitmq 3.12.4 一、下载 1.1 下载erlang 官网下载地址&#xff1a; 1.2 下载rabbitmq 官网下载地址&#xff1a; 建议使用解压版&#xff0c;安装版可能会在安装软件…

HTML静态网页成品作业(HTML+CSS)——自行车介绍网页设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码CSS部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品…

工厂电气及PLC【1章各种元件符号】

交流接触器的线圈通电后&#xff0c;线圈电流会产生磁场&#xff0c;衔铁在磁吸引力作用下带动触点动作&#xff1a;常开的主触点闭合&#xff0c;接通主电路&#xff1b;同时&#xff0c;常开的辅助触点闭合&#xff0c;常闭的辅助触点断开。当线圈失电或电压显著降低时&#…

使用GraphQL构建现代API

使用GraphQL构建现代API GraphQL简介 安装GraphQL 使用npm安装GraphQL 使用Yarn安装GraphQL 创建GraphQL服务器 定义Schema 编写Resolver 查询数据 变更数据 使用Apollo Client GraphQL订阅 数据验证 错误处理 分页查询 拆分和组合Schema 总结 随着API的发展&#xff0c;传统…

用Python设置、更新和获取Excel单元格的值

Excel工作簿作为一款广泛使用的数据管理工具&#xff0c;与Python相结合&#xff0c;可以使得自动化处理大量数据成为可能。通过Python来设置、更新以及读取Excel单元格的值&#xff0c;不仅可以极大地提高工作效率&#xff0c;减少重复劳动&#xff0c;还能增强数据处理流程的…

利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛:台风预测与分析

利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛&#xff1a;台风预测与分析 引言 在2024年MathorCup大数据挑战赛中&#xff0c;赛道A聚焦于气象数据分析&#xff0c;特别是台风的生成、路径预测、和降水风速特性等内容。本次比赛的任务主要是建立一个分类评价模型&…

Logback 常用配置详解

1. 配置文件解析 Logback 是 Spring Boot 默认使用的日志框架&#xff0c;Logback 配置主要包含 8 大元素 1.1 configuration Logback 配置文件的根元素&#xff0c;它包含所有的配置信息 1.2 appender 定义一个 Appender&#xff0c;即日志输出的目的地&#xff0c;如控制…

造纸行业湿法粉碎机、高速破碎机、粉碎磨粉机

细胞磨在造纸行业的应用主要体现在以下几个方面&#xff1a; 1.原料处理 细碎与研磨&#xff1a;造纸行业的原料&#xff0c;如木材、竹材等&#xff0c;需要经过细碎和研磨处理以获取适合造纸的纤维。细胞磨能够高效地实现这一过程&#xff0c;将原料细化至所需的粒度&#…

JAVA基础:jdbc (学习笔记)

基础操作 任何一种jdbc操作&#xff0c;都是由7步完成的 手动加载数据库驱动类{反射}获得连接对象写sql语句获得执行对象执行sql语句&#xff0c;同时获得结果处理结果关闭资源 功能一&#xff1a;添加表里的数据 public static void main4(String[] args) throws ClassNotF…

RabbitMQ最全教程-Part1(基础使用)

一、消息队列基本概念 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构 1、消息队列的特点 可靠性 消息持久化&#xff…

英伟达 GPU 架构:演进与模型推理速度的深度关联

英伟达的 GPU 架构演进之路充满了创新与突破。 ©作者|Zane 来源|神州问学 一、 英伟达GPU的架构演进之路 1999 年&#xff0c;英伟达发布 Geforce256 图形处理芯片&#xff0c;首次提出 GPU 概念。早期的架构如 G80 或 GeForce 8800 GTX&#xff0c;包含 8 个 TPC&#…

Yolo V4详解

Yolo V4&#xff08;You Only Look Once version 4&#xff09;是一种先进的目标检测系统&#xff0c;于2020年推出。作为Yolo系列算法的最新版本&#xff0c;Yolo V4继承了其前代版本的优点&#xff0c;并在此基础上进行了多项改进&#xff0c;使得其性能得到了显著提升。本文…

实体类中为什么要实现serializable接口

最近见到好多项目中写的代码&#xff0c;在实体类中实现了Serializable接口。说实话&#xff1a;这个在以前学习的时候&#xff0c;貌似学过&#xff0c;但是一直没有用过&#xff0c;所以看着一脸懵逼&#xff0c;但是别人总不可能随便写的吧.....所以就去查了一下这个接口。 …

D55【python 接口自动化学习】- python基础之模块与标准库

day55 练习&#xff1a;实现求导 学习日期&#xff1a;20241101 学习目标&#xff1a;模块与标准库 -- 70 小试牛刀&#xff1a;如何使用Python为函数求导&#xff1f; 学习笔记&#xff1a; 需求分析 使用第三方模块实现函数求导 编写程序并测试 # 求导 from sympy import…

推荐一款功能强大的AI实时变声器:FliFlik Voice Changer

FliFlik VoiCE Changer是一款专注于声音变换与音频处理的创新软件&#xff0c;旨在满足从日常娱乐、游戏直播到播客制作、专业音频编辑的多种应用场景需求。无论是想在游戏中变换声音逗乐队友&#xff0c;还是在播客中塑造个性化的音效&#xff0c;这款软件都能提供灵活而强大的…