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

每天学习一个技术栈 ——【Django Channels】篇(1)

        在当今快速发展的技术领域,掌握多种技术栈已经成为开发者提升竞争力的关键。随着实时应用需求的不断增加,如何高效地处理并发请求和实时通信变得尤为重要。在众多解决方案中,Django Channels作为Django框架的强大扩展,能够轻松实现WebSocket和异步任务处理,使得开发实时应用变得简单而高效。

        本文将深入探讨Django Channels的功能与应用,通过创建一个简单的实时聊天应用,带领读者一步步理解如何将这一技术栈应用于实际项目中。无论你是刚接触Django的初学者,还是希望扩展现有技能的开发者,这篇文章都将为你提供有价值的见解和实践经验。


一、Django Channels 概述

Django Channels是一个扩展Django的库,旨在为开发者提供对WebSocket、HTTP2等异步协议的支持。它使得Django能够处理并发请求,从而创建出更具互动性和实时性的应用。

1. 功能与特点
  • 实时通信:通过WebSocket协议,Django Channels能够实现实时的数据交换,适用于聊天应用、在线游戏和实时通知等场景。

  • 异步处理:借助ASGI(异步网关接口),Django Channels允许在处理请求时使用异步编程模型,从而提高应用的性能和响应速度。

  • 灵活性:Channels支持多种后端,包括Redis和RabbitMQ,作为消息代理,增强了消息传递的可靠性与效率。

  • 与Django的无缝集成:作为Django的官方扩展,Channels能够与Django的视图、模型和中间件等核心功能完美结合,使得开发者可以继续使用熟悉的Django环境。

2. 应用场景
  • 实时聊天应用:用户可以在同一页面实时交流,消息即时送达,提升用户体验。

  • 在线协作工具:允许用户在多个客户端间进行实时编辑和更新。

  • 通知系统:用户可以接收到即时的系统通知或更新,无需刷新页面。

  • 实时数据更新:如金融市场数据、天气预报等动态信息的实时展示。

3. 架构组成

Django Channels的架构主要由以下几个部分组成:

  • 消费者(Consumers):类似于Django的视图,消费者处理来自WebSocket的连接、消息和断开连接事件。

  • 路由(Routing):负责将WebSocket请求路由到相应的消费者。

  • 通道层(Channel Layer):用于在不同的消费者之间进行消息传递,可以选择使用Redis或RabbitMQ等后端。

通过这些组件的协同工作,Django Channels能够提供一个强大且灵活的框架,以支持高并发的实时应用开发。


二、如何安装和配置

        在开始使用Django Channels之前,我们需要安装并进行基本配置。以下步骤将指导你完成这一过程。

1. 安装Django Channels

首先,确保你已经安装了Django。然后,你可以使用pip来安装Django Channels。打开命令行,输入以下命令:

pip install channels

如果打算使用Redis作为通道层的后端,还需要安装Redis支持库:

pip install channels_redis
2. 修改Django设置文件

在你的Django项目中,找到settings.py文件,进行如下修改:

  • 添加Channels到已安装应用
    INSTALLED_APPS = [...'channels',...
    ]
    
  • 指定ASGI应用

替换默认的WSGI应用为ASGI应用:

ASGI_APPLICATION = 'your_project_name.asgi.application'

这里的your_project_name是你的Django项目的名称。

3. 创建ASGI配置文件

在项目根目录下,创建一个名为asgi.py的文件,并添加以下代码:

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

在这里,你需要替换your_app_nameyour_project_name为相应的名称。

4. 配置路由

在你的应用目录中,创建一个名为routing.py的文件,定义WebSocket路由:

from django.urls import path
from . import consumerswebsocket_urlpatterns = [path('ws/some_path/', consumers.YourConsumer.as_asgi()),
]

这里的YourConsumer是你将在后续创建的消费者类。

5. 启动Redis(可选)

如果你使用Redis作为通道层,请确保Redis服务器正在运行。你可以在本地安装Redis,并通过以下命令启动:

redis-server
6. 运行开发服务器

最后,运行Django开发服务器以测试配置:

python manage.py runserver

 如果一切设置正确,应该可以通过WebSocket连接进行通信。


三、创建一个简单的实时聊天应用

        在本节中,将逐步构建一个简单的实时聊天应用,以展示如何使用Django Channels实现实时功能。我们将涵盖项目结构、核心代码示例以及前端实现。

1. 项目结构

首先,确保你的Django项目结构如下:

your_project_name/
│
├── your_app_name/
│   ├── __init__.py
│   ├── asgi.py
│   ├── consumers.py
│   ├── routing.py
│   ├── urls.py
│   ├── views.py
│   └── templates/
│       └── chat/
│           └── chat.html
│
├── your_project_name/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
│
└── manage.py
2. 创建消费者(Consumers)

your_app_name目录下创建一个名为consumers.py的文件,定义WebSocket消费者:

import json
from channels.generic.websocket import AsyncWebsocketConsumerclass ChatConsumer(AsyncWebsocketConsumer):async def connect(self):self.room_name = 'chat_room'self.room_group_name = 'chat_%s' % 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)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})async def chat_message(self, event):message = event['message']# 发送消息到WebSocketawait self.send(text_data=json.dumps({'message': message}))
3. 配置路由

routing.py文件中,添加WebSocket路由:

from django.urls import path
from . import consumerswebsocket_urlpatterns = [path('ws/chat/', consumers.ChatConsumer.as_asgi()),
]
4. 创建前端页面

your_app_name/templates/chat/目录下创建chat.html文件,编写基本的HTML和JavaScript代码以实现聊天功能:

<!DOCTYPE html>
<html>
<head><title>聊天应用</title>
</head>
<body><h1>实时聊天</h1><div id="chat-log"></div><input id="chat-message-input" type="text" size="100"><input id="chat-message-submit" type="button" value="发送"><script>const chatLog = document.getElementById('chat-log');const chatInput = document.getElementById('chat-message-input');const chatSubmit = document.getElementById('chat-message-submit');const chatSocket = new WebSocket('ws://' + window.location.host + '/ws/chat/');chatSocket.onmessage = function(e) {const data = JSON.parse(e.data);chatLog.innerHTML += (data.message + '<br>');};chatSocket.onclose = function(e) {console.error('聊天连接已关闭!');};chatSubmit.onclick = function(e) {const message = chatInput.value;chatSocket.send(JSON.stringify({'message': message}));chatInput.value = '';};</script>
</body>
</html>
5. 添加视图和URL配置

views.py中添加一个视图来渲染聊天页面:

from django.shortcuts import renderdef chat_view(request):return render(request, 'chat/chat.html')

urls.py中添加对应的URL配置: 

from django.urls import path
from .views import chat_viewurlpatterns = [path('chat/', chat_view, name='chat'),
]
6. 运行开发服务器

确保Redis服务器正在运行,然后启动Django开发服务器:

python manage.py runserver

现在,打开浏览器访问 http://127.0.0.1:8000/chat/ ,你应该能看到一个简单的聊天界面。你可以在多个浏览器窗口中打开聊天页面,输入消息并实时交流。


后篇:每天学习一个技术栈 ——【Django Channels】篇(2)-CSDN博客

相关文章:

  • Kafka与RabbitMQ:深入理解两者之间的区别
  • MySQL基础--表的增删改查
  • 时间技能物品竞品抢拍拍卖发布h5公众号小程序开源版开发
  • 笔记整理—linux进程部分(2)使用fork创建进程
  • 尚品汇-自动化部署-Jenkins的安装与环境配置(五十六)
  • 十分钟实现内网连接,配置frp
  • JavaWeb图书借阅系统
  • MapBox Android版开发 6 关于Logo
  • [java][代码]DateUtil用于处理日期和时间
  • excel怎么转换json
  • C++初阶:STL详解(九)——stacke和queue的模拟实现
  • kmeans聚类分析 生活使用案例
  • 解决Windows远程桌面 “为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多,请稍后片刻再重试,或与系统管理员或技术支持联系“问题
  • Java之多态
  • 关于贪心算法
  • Android交互
  • JS基础之数据类型、对象、原型、原型链、继承
  • nfs客户端进程变D,延伸linux的lock
  • php ci框架整合银盛支付
  • python学习笔记 - ThreadLocal
  • Redis学习笔记 - pipline(流水线、管道)
  • SpringCloud集成分布式事务LCN (一)
  • 不上全站https的网站你们就等着被恶心死吧
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 跨域
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 用 Swift 编写面向协议的视图
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • !!java web学习笔记(一到五)
  • #git 撤消对文件的更改
  • #mysql 8.0 踩坑日记
  • (备份) esp32 GPIO
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十)c52学习之旅-定时器实验
  • (十六)串口UART
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)memcache、redis缓存
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .bat批处理(一):@echo off
  • .cfg\.dat\.mak(持续补充)
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net分布式压力测试工具(Beetle.DT)
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • @NotNull、@NotEmpty 和 @NotBlank 区别
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)