当前位置: 首页 > 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博客

相关文章:

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

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

js设计模式-工厂模式 单例模式 观察者模式 发布订阅模式 原型模式 代理模式 迭代器模式

1 工厂模式 // 工厂模式: 调用函数返回对象function factory(name, age){return {name: name,age: age} }const person1 factory(Tom, 18); // 类似的库使用工厂函数的有: jQuery, React.createElement,axios.create,vue.createApp等 2 单例模式 // 单例模式&#xff1a;单…...

关于Java中的List<User>如何进行深拷贝

联调中发现了一个很初级&#xff0c;但有容易被忽略的拷贝问题&#xff1a; 错误方式&#xff1a;List<User> us new ArrayList<>(); // name "张三"List<User> us1 new ArrayList<>(us);for (User u : us) {...u.setName("douzi&q…...

2025 年 IT 前景:机遇与挑战并存,人工智能和云计算成重点

云计算de小白 投资人工智能&#xff1a;平衡潜力与实用性 到 2025 年&#xff0c;人工智能将成为 IT 支出的重要驱动力&#xff0c;尤其是在生成式人工智能领域。人工智能的前景在于它有可能彻底改变业务流程、增强决策能力并开辟新的收入来源。然而&#xff0c;现实情况更加微…...

Cortex-A7和Cortex-M7架构处理器取中断向量全流程分析

0 参考资料 Cortex M3权威指南(中文).pdf ARM Cortex-A(armV7)编程手册V4.0.pdf1 Cortex-A7和Cortex-M7处理器架构取中断向量全流程分析 1.1 什么是中断向量&#xff1f; 中断向量就是中断服务函数入口地址&#xff0c;例如我们发生了EXTI0中断&#xff0c;就需要执行EXT0中…...

MODELS 2024震撼续章:科技与可持续性的未来交响曲

MODELS 2024国际会议正如火如荼地进行着&#xff0c;每一天都充满了新的发现与启迪&#xff0c;每一场分享都是对技术前沿的一次深刻探索&#xff0c;更是对现实世界可持续性挑战的一次积极回应。现在让我们继续这场科技盛宴&#xff0c;看看小编为您精选几场的学术分享吧~ 会议…...

CICD 持续集成与持续交付

一 、CICD是什么 CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 1.1 持续集成&#xff08;Continuous Integration&#xff09; 持续集…...

“数据面”(Data Plane)是指负责实际数据处理和转发的部分

在计算机网络和服务架构中&#xff0c;“数据面”&#xff08;Data Plane&#xff09;是指负责实际数据处理和转发的部分。数据面负责执行具体的网络通信任务&#xff0c;如接收、处理和转发数据包。与数据面对应的是“控制面”&#xff08;Control Plane&#xff09;&#xff…...

面试题:MySQL你用过WITH吗?领免费激活码

感谢Java面试教程的Java多线程文章&#xff0c;点击查看>原文 Java面试教程&#xff0c;发mmm116可获取IDEA-jihuoma 在MySQL中&#xff0c;WITH子句用于定义临时表或视图&#xff0c;也称为公共表表达式&#xff08;CTE&#xff09;。它允许你在一个查询中定义一个临时结果…...

consul 介绍与使用,以及spring boot 项目的集成

目录 前言一、Consul 介绍二、Consul 的使用三、Spring Boot 项目集成 Consul总结前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是…...

Linux常用命令shell常用知识 。。。。面试被虐之后,吐血整理。。。。

Linux三剑客&常用命令&shell常识 Linux三剑客grep - print lines matching a patternsed - stream editor for filtering and transforming textawkman awk Linux常用命令dd命令ssh命令tar命令curl命令top命令tr命令xargs命令sort命令du/df/free命令 shell 知识functio…...

压力测试指南-压力测试基础入门

压力测试基础入门 在当今快速迭代的软件开发环境中&#xff0c;确保应用程序在高负载情况下仍能稳定运行变得至关重要。这正是压力测试大显身手的时刻。本文将带领您深入了解压力测试的基础知识&#xff0c;介绍实用工具&#xff0c;并指导您设计、执行压力测试&#xff0c;最…...

Linux:LCD驱动开发

目录 1.不同接口的LCD硬件操作原理 应用工程师眼中看到的LCD 1.1像素的颜色怎么表示 ​编辑 1.2怎么把颜色发给LCD 驱动工程师眼中看到的LCD 统一的LCD硬件模型 8080接口 TFTRGB接口 什么是MIPI Framebuffer驱动程序框架 怎么编写Framebuffer驱动框架 硬件LCD时序分析…...

QT:常用类与组件

1.设计QQ的界面 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QLineEdit> #include <QLabel>//自定义类Widget,采用public方式继承QWidget&#xff0c;该类封装了图形化界面的相关操作&#xff…...

企业内训|提示词工程师高阶技术内训-某运营商研发团队

近日&#xff0c;TsingtaoAI为某运营商技术团队交付提示词工程师高级技术培训&#xff0c;本课程为期2天&#xff0c;深入探讨深度学习与大模型技术在提示词生成与优化、客服大模型产品设计等业务场景中的应用。内容涵盖了深度学习前沿理论、大模型技术架构设计与优化、以及如何…...

K8S真正删除pod

假设k8s的某个命名空间如&#xff08;default&#xff09;有一个运行nginx 的pod&#xff0c;而这个pod是以kubectl run pod命令运行的 1.错误示范&#xff1a; kubectl delete pod nginx-2756690723-hllbp 结果显示这个pod 是删除了&#xff0c;但k8s很快自动创建新的pod,但是…...

数据结构:队列及其应用

队列&#xff08;Queue&#xff09;是一种特殊的线性表&#xff0c;它的主要特点是先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;。队列只允许在一端&#xff08;队尾&#xff09;进行插入操作&#xff0c;而在另一端&#xff08;队头&#xff09;进行删…...

26个用好AI大模型的提示词技巧

如果你已深入探索过ChatGPT、Microsoft Copilot、风变AI等前沿的生成式AI工具&#xff0c;那么你对“prompt”&#xff08;提示词&#xff09;这一核心概念一定有自己的认知。 作为连接你与AI创意源泉的桥梁&#xff0c;“prompt”不仅是触发无限想象的钥匙&#xff0c;更是塑…...

线性表二——栈stack

第一题 #include<bits/stdc.h> using namespace std; stack<char> s; int n; string ced;//如何匹配 出现的右括号转换成同类型的左括号&#xff0c;方便我们直接和栈顶元素 char cheak(char c){if(c)) return (;if(c]) return [;if(c}) return {;return \0;/…...

浏览器发送请求后关闭,服务器的处理过程

之前在开发中&#xff0c;有些后端服务处理非常慢&#xff0c;页面可能会出现504 Gateway time-out的提示&#xff0c;或者服务器还没返回数据&#xff0c;浏览器就关掉了。我们只是看到了浏览器关掉&#xff0c;但是服务器和客户端的状态都是什么样的呢&#xff1f; 问题 在…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...