使用 Django Channels 构建实时聊天应用(包含用户认证和消息持久化)
文章目录
- 准备工作
- 创建 Django 项目
- 创建应用程序
- 配置项目
- 编写 Consumer
- 编写路由
- 创建 URL 路由
- 运行应用
- 用户认证
- 消息持久化
- 显示历史消息
- 结论
Django Channels 是 Django 的一个扩展,允许在 Web 应用中添加实时功能,例如 Websockets、HTTP2 和其他协议。本文将介绍如何使用 Django Channels 构建一个简单的实时聊天应用程序。

准备工作
首先,确保你已经安装了 Django 和 Channels。你可以使用以下命令安装:
pip install django channels
创建 Django 项目
使用以下命令创建一个新的 Django 项目:
django-admin startproject realtime_chat
然后进入项目目录:
cd realtime_chat
创建应用程序
创建一个新的 Django 应用程序:
python manage.py startapp chat
配置项目
在 settings.py 文件中添加 Channels 的配置:
# settings.pyINSTALLED_APPS = [...'channels','chat',
]ASGI_APPLICATION = 'realtime_chat.routing.application'
创建一个新的 ASGI 路由文件 routing.py:
# routing.pyfrom channels.routing import ProtocolTypeRouterapplication = ProtocolTypeRouter({})
编写 Consumer
在 consumers.py 文件中编写一个简单的 Consumer:
# chat/consumers.pyfrom channels.generic.websocket import AsyncWebsocketConsumerclass ChatConsumer(AsyncWebsocketConsumer):async def connect(self):await self.accept()async def disconnect(self, close_code):passasync def receive(self, text_data):pass
编写路由
在 routing.py 文件中添加路由配置:
# routing.pyfrom channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from django.urls import path
from chat.consumers import ChatConsumerapplication = ProtocolTypeRouter({'websocket': AuthMiddlewareStack(URLRouter([path('chat/', ChatConsumer.as_asgi()),])),
})
创建 URL 路由
在 urls.py 文件中添加 URL 路由:
# chat/urls.pyfrom django.urls import path
from . import consumerswebsocket_urlpatterns = [path('chat/', consumers.ChatConsumer.as_asgi()),
]
在主项目的 urls.py 中包含 Chat 应用的路由:
# realtime_chat/urls.pyfrom django.urls import path, includeurlpatterns = [...path('chat/', include('chat.urls')),
]
运行应用
运行 Django 服务器:
python manage.py runserver
现在,你可以通过访问 http://localhost:8000/chat/ 来测试你的实时聊天应用了。
用户认证
首先,我们将使用 Django 自带的认证系统来处理用户认证。在 settings.py 中启用认证系统:
# settings.pyINSTALLED_APPS = [...'django.contrib.auth','django.contrib.contenttypes',...
]AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend',
]
然后,我们需要修改 ChatConsumer,以便处理用户认证:
# chat/consumers.pyfrom channels.generic.websocket import AsyncWebsocketConsumer
from django.contrib.auth.models import AnonymousUserclass ChatConsumer(AsyncWebsocketConsumer):async def connect(self):self.user = self.scope["user"]if isinstance(self.user, AnonymousUser):await self.close()else:await self.accept()async def disconnect(self, close_code):passasync def receive(self, text_data):pass
现在,只有经过身份验证的用户才能连接到聊天消费者。
消息持久化
我们希望用户在重新加载页面后能够看到之前的聊天消息。为了实现这一点,我们将使用 Django 的数据库来存储消息。
首先,我们需要创建一个模型来存储聊天消息:
# chat/models.pyfrom django.db import models
from django.contrib.auth.models import Userclass Message(models.Model):user = models.ForeignKey(User, on_delete=models.CASCADE)content = models.TextField()timestamp = models.DateTimeField(auto_now_add=True)def __str__(self):return f"{self.user.username}: {self.content}"
然后,我们需要修改 ChatConsumer,以便在接收到消息时将其保存到数据库中:
# chat/consumers.pyfrom channels.generic.websocket import AsyncWebsocketConsumer
from django.contrib.auth.models import AnonymousUser
from .models import Message
import jsonclass ChatConsumer(AsyncWebsocketConsumer):async def connect(self):self.user = self.scope["user"]if isinstance(self.user, AnonymousUser):await self.close()else:await self.accept()async def disconnect(self, close_code):passasync def receive(self, text_data):text_data_json = json.loads(text_data)content = text_data_json['message']message = Message.objects.create(user=self.user, content=content)message.save()
现在,当用户发送消息时,它们将被保存到数据库中。
显示历史消息
最后,我们需要修改前端以显示历史消息。在 ChatConsumer 中,我们可以添加一个方法来发送历史消息给客户端:
# chat/consumers.pyclass ChatConsumer(AsyncWebsocketConsumer):...async def fetch_messages(self):messages = Message.objects.all()[:10] # 获取最近的10条消息content = {'command': 'messages','messages': self.messages_to_json(messages)}await self.send(text_data=json.dumps(content))@staticmethoddef messages_to_json(messages):result = []for message in messages:result.append({'user': message.user.username,'content': message.content,'timestamp': str(message.timestamp)})return result
然后,在连接建立时调用这个方法:
# chat/consumers.pyasync def connect(self):...await self.fetch_messages()
在前端,你可以使用 JavaScript 来接收并显示历史消息。
结论
通过添加用户认证和消息持久化功能,我们的实时聊天应用变得更加完善和实用。你可以根据需要进一步定制和扩展这个应用,例如添加在线用户列表、私聊功能等。Django Channels 提供了强大的工具,让你可以构建出功能丰富的实时 Web 应用。
相关文章:
使用 Django Channels 构建实时聊天应用(包含用户认证和消息持久化)
文章目录 准备工作创建 Django 项目创建应用程序配置项目编写 Consumer编写路由创建 URL 路由运行应用用户认证消息持久化显示历史消息结论 Django Channels 是 Django 的一个扩展,允许在 Web 应用中添加实时功能,例如 Websockets、HTTP2 和其他协议。本…...
【Elasticsearch】es基础入门-03.RestClient操作文档
RestClient操作文档 示例: 一.初始化JavaRestClient (一)引入es的RestHighLevelClient依赖 <!--elasticsearch--> <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest…...
LeetCode - 二分查找(Binary Search)算法集合(Python)[左右边界|旋转数组|双列表]
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/139419653 二分查找,也称为折半查找,是一种在有序数组中查找特定元素的高效算法。其基本原理是将待搜索的区间分成两半&am…...
android睡眠分期图
一、效果图 做医疗类项目,经常会遇到做各种图表,本文做的睡眠分期图。 二、代码 引入用到的库 api joda-time:joda-time:2.10.1 调用代码 /*** 睡眠* 分期*/private SleepChartAdapter mAdapter;private SleepChartAttrs mAttrs;private List<SleepI…...
2023年信息素养大赛小学组C++智能算法复赛真题
今天给大家分享2023年全国青少年信息素养大赛小学组C智能算法挑战赛复赛里面的一套真题,希望有助于大家了解复赛的难度及备考。 其他真题下载:网盘-真题-信息素养大赛...
独立游戏开发的 6 个步骤
💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…...
Stable Diffusion AI绘画:从创意词汇到艺术图画的魔法之旅
文章目录 一、Stable Diffusion的工作原理二、从提示词到模型出图的过程三、Stable Diffusion在艺术创作中的应用《Stable Diffusion AI绘画从提示词到模型出图》内容简介作者简介楚天 目录前言/序言本书特色特别提示 获取方式 在科技的飞速发展中,Stable Diffusion…...
使用C++实现高效的套接字连接池
在现代网络应用中,高效管理网络连接是实现高并发和低延迟的重要因素。下面将详细介绍如何使用C实现一个高效的套接字连接池,以便在需要时快速复用连接,从而提高系统性能和资源利用率。 一、什么是连接池? 连接池是一种管理网络连…...
个人百度百科怎么创建
编辑百度词条是一个相对简单的流程,但需要注意的是,并不是所有的词条都可以编辑,部分锁定的词条是无法编辑的,但可以通过官方平台申请解封。以下百科优化网yajje分享是详细的步骤: 注册百度账号 首先,用户…...
Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:潍柴雷沃智慧农业无人驾驶
潍柴雷沃智慧农业科技股份有限公司,是潍柴集团重要的战略业务单元,旗下收获机械、拖拉机等业务连续多年保持行业领先,是国内少数可以为现代农业提供全程机械化整体解决方案的品牌之一。潍柴集团完成对潍柴雷沃智慧农业战略重组后,…...
ICPC训练赛补题集
ICPC训练赛补题集 文章目录 ICPC训练赛补题集D - Fast and Fat (负重越野)I-路径规划G. Inscryption(邪恶铭刻)NEW Houses雪中楼(西安交通大学)L.BracketGenerationE - Checksum D - Fast and Fat (负重越野) 原题链接:原题链接 题意:体重大的背体重小的…...
The First项目报告:解读去中心化衍生品交易所AVEO
2023 年12月8日凌晨,Solana 生态 MEV 基础设施开发商 Jito Labs 开放了 JTO 空投申领窗口,JTO 的价格在开盘短暂震荡后迅速攀高,一度触及 4.94 美元。 JTO 是加密社区这两日关注的热门标的,而在这场讨论中,除 Solana …...
Docker 快速更改容器的重启策略(Restart Policies)以及重启策略详解
目录 1. 使用 docker update 命令2. 在启动容器时指定重启策略3. 在 Docker Compose 文件中指定重启策略4. 总结 官方文档:Start containers automatically 1. 使用 docker update 命令 Docker 提供了 docker update 命令,可以在容器运行时更改其重启策…...
docker 启动关闭,设置仓库地址
1. 配置/etc/docker/daemon.json cat /etc/docker/daemon.json# 内容 {"registry-mirrors": ["https://0nth4654.mirror.aliyuncs.com"],"insecure-registries": ["harbor.domain.io"] }2. 配置systemd启动文件 和方法1配置会有冲突&a…...
二叉树的链式结构实现
前言 该篇是在二叉树介绍及堆-CSDN博客的基础上的。该篇会有点抽象大家要自己多画画图自己感受一下。现在我们开始吧! 在学习二叉树基本操作时,我们需要先有一个现成的二叉树。来方便我们练习。因为现在我们对二叉树的理解也并不是很深入。在这里创建一个…...
MySQL远程连接
文章目录 MySQL远程连接(Linux)一、更改MySQL配置文件二、进入MySQL修改用户表host值三、使用其他电脑即可远程访问数据库MySQL远程连接(Linux)一、修改my.ini中的配置文件二、修改用户权限三、远程连接 MySQL远程连接(Linux) 以下MySQL远程连接:MySQL部署环境为Ubu…...
奔驰大G升级电动踏板效果
奔驰大G车型的升级旋转电动踏板是一项非常实用的功能,它为驾驶者提供了诸多便利和舒适性。以下是关于这一功能的实用性介绍: 便利的上下车体验:旋转电动踏板可以在车辆停稳的情况下自动伸出,为乘客提供便利的上下车体验。特别是对…...
【xilinx】vivado中的xpm_cdc_gray.tcl的用途
背景 【Xilinx】vivado methodology检查中出现的critical Warning-CSDN博客 接上篇文章,在vivado进行 methodology检查时出现了严重警告,顺着指示查到如下一些问题 TIMING #1 Warning An asynchronous set_clock_groups or a set_false path (see con…...
windows中安装zookeeper
https://zhuanlan.zhihu.com/p/692451839 【zookeeper】在Windows上启动zookeeper_windows启动zk-CSDN博客 Index of /apache/zookeeper/zookeeper-3.9.2 Index of /apache/zookeeper/zookeeper-3.9.2 Zookeeper的应用场景 1、配置管理 2、服务注册中心 3、主从协调 4、…...
直接写和放在函数中不同的R语言用法
索引数据框中的某一列 df$A可以索引数据框df中列名为A的列的所有值。那么假如列名是一个R对象怎么做? df <- data.frame(A1:5, B(1:5)*2)df$A## [1] 1 2 3 4 5needed_column A# df$needed_column ? Wrong# 注意是双方括号 df[[needed_column]]## [1] 1 2 3 4…...
UE5手写HLSL实现高斯模糊:精准控制σ与采样策略
1. 这不是“调个参数就完事”的模糊——为什么UE5里手写HLSL才是高斯模糊的正解在UE5材质编辑器里拖几个“Blur”节点,调调Radius,预览框里画面立刻柔化——这确实是最快上手的方式。但上周我帮一个做影视级虚拟制片的团队优化镜头转场效果时,…...
口岸突发事件回溯,无感定位实现 UWB 达不到的全域时空复盘
口岸突发事件回溯,无感定位实现 UWB 达不到的全域时空复盘口岸突发事件应急复盘、轨迹溯源、责任界定是国门安全风控、事件处置、执法取证的核心关键。口岸闯关冲卡、违规尾随、异常聚集、滞留徘徊、人车冲突等突发场景具备瞬时性、跨区域、高动态、多主体混杂特征&…...
昇腾CANN manifest:仓库清单与版本管理实战
55 个独立仓库,每个仓库独立迭代——CANN 8.0 里的 ops-transformer 是哪个 commit?hccl 是 v2.1.3 还是 v2.2.0?runtime 和 driver 的版本是否兼容?manifest 仓库用一份 XML 格式的清单文件回答了所有这些问题。它是 CANN 发行版…...
从录制到规划:手把手教你用CARLA录制点云,在Autoware中构建完整自动驾驶仿真闭环
从CARLA到Autoware:构建自定义自动驾驶仿真场景的完整实践指南 在自动驾驶技术快速迭代的今天,仿真测试已成为算法验证不可或缺的环节。CARLA与Autoware作为开源仿真平台和自动驾驶框架的黄金组合,为研究者提供了高度灵活的测试环境。本文将深…...
2025年AI数字人行业现状:全国超99万家企业涌入,真正能落地的不到一成
当生成式AI的浪潮席卷各行各业,AI数字人成为最先跑出商业化落地速度的细分赛道。然而,在全国超99万家相关企业蜂拥而入的热闹背后,一个残酷的现实正在显现:绝大多数所谓的"AI数字人"不过是披着科技外衣的"会动的照…...
渗透测试小白上手指南:系统化故障排查能力迁移手册
1. 别被“渗透测试”四个字吓住:它本质是系统化的故障排查能力很多人第一次听说“渗透测试”,脑子里立刻浮现出黑客电影里飞速滚动的代码、黑底绿字的终端、几秒钟攻破银行防火墙的炫酷场面。结果一搜学习资料,满屏都是“Kali Linux”“Metas…...
深度解析Magic VLSI:开源集成电路布局设计的基石工具
深度解析Magic VLSI:开源集成电路布局设计的基石工具 【免费下载链接】magic Magic VLSI Layout Tool 项目地址: https://gitcode.com/gh_mirrors/magi/magic 在集成电路设计领域,Magic VLSI Layout Tool 作为一款历史悠久的开源布局编辑器&#…...
还在用--v 6硬套?揭秘Midjourney水效渲染的3层隐式建模逻辑:表面张力→次表面散射→环境光遮蔽耦合
更多请点击: https://kaifayun.com 第一章:Midjourney水效果渲染的认知跃迁 传统图像生成中对液体物理特性的模拟长期依赖预设材质贴图与后期合成,而 Midjourney v6 及后续版本通过隐式神经场(Implicit Neural Field)…...
5步终极指南:如何永久免费使用Cursor Pro AI编程助手
5步终极指南:如何永久免费使用Cursor Pro AI编程助手 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tria…...
好用只是入场券,敢用才是护城河:企业级Agent如何进入真实业务
好用只是入场券 2026 年,小龙虾、OpenClaw、Hermes 等 Agent 产品接连出圈之后,很多企业开始重新审视一件事:AI 不再只是一个回答问题的工具,它正在变成可以接任务、调系统、走流程的数字执行单元。 这件事在演示里通常很顺。 一句…...
