使用 Django Channels 构建实时聊天应用(包含用户认证和消息持久化)

news2024/11/7 20:56:06

文章目录

    • 准备工作
    • 创建 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.py

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

ASGI_APPLICATION = 'realtime_chat.routing.application'

创建一个新的 ASGI 路由文件 routing.py

# routing.py

from channels.routing import ProtocolTypeRouter

application = ProtocolTypeRouter({

})

编写 Consumer

consumers.py 文件中编写一个简单的 Consumer:

# chat/consumers.py

from channels.generic.websocket import AsyncWebsocketConsumer

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()

    async def disconnect(self, close_code):
        pass

    async def receive(self, text_data):
        pass

编写路由

routing.py 文件中添加路由配置:

# routing.py

from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from django.urls import path
from chat.consumers import ChatConsumer

application = ProtocolTypeRouter({
    'websocket': AuthMiddlewareStack(
        URLRouter([
            path('chat/', ChatConsumer.as_asgi()),
        ])
    ),
})

创建 URL 路由

urls.py 文件中添加 URL 路由:

# chat/urls.py

from django.urls import path
from . import consumers

websocket_urlpatterns = [
    path('chat/', consumers.ChatConsumer.as_asgi()),
]

在主项目的 urls.py 中包含 Chat 应用的路由:

# realtime_chat/urls.py

from django.urls import path, include

urlpatterns = [
    ...
    path('chat/', include('chat.urls')),
]

运行应用

运行 Django 服务器:

python manage.py runserver

现在,你可以通过访问 http://localhost:8000/chat/ 来测试你的实时聊天应用了。

用户认证

首先,我们将使用 Django 自带的认证系统来处理用户认证。在 settings.py 中启用认证系统:

# settings.py

INSTALLED_APPS = [
    ...
    'django.contrib.auth',
    'django.contrib.contenttypes',
    ...
]

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
]

然后,我们需要修改 ChatConsumer,以便处理用户认证:

# chat/consumers.py

from channels.generic.websocket import AsyncWebsocketConsumer
from django.contrib.auth.models import AnonymousUser

class 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):
        pass

    async def receive(self, text_data):
        pass

现在,只有经过身份验证的用户才能连接到聊天消费者。

消息持久化

我们希望用户在重新加载页面后能够看到之前的聊天消息。为了实现这一点,我们将使用 Django 的数据库来存储消息。

首先,我们需要创建一个模型来存储聊天消息:

# chat/models.py

from django.db import models
from django.contrib.auth.models import User

class 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.py

from channels.generic.websocket import AsyncWebsocketConsumer
from django.contrib.auth.models import AnonymousUser
from .models import Message
import json

class 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):
        pass

    async 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.py

class 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))

    @staticmethod
    def 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.py

async def connect(self):
    ...
    await self.fetch_messages()

在前端,你可以使用 JavaScript 来接收并显示历史消息。

结论

通过添加用户认证和消息持久化功能,我们的实时聊天应用变得更加完善和实用。你可以根据需要进一步定制和扩展这个应用,例如添加在线用户列表、私聊功能等。Django Channels 提供了强大的工具,让你可以构建出功能丰富的实时 Web 应用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CasaOS玩客云如何部署小雅AList并结合内网穿透远程访问海量资源

文章目录 前言1. 本地部署AList2. AList挂载网盘3. 部署小雅alist3.1 Token获取3.2 部署小雅3.3 挂载小雅alist到AList中 4. Cpolar内网穿透安装5. 创建公网地址6. 配置固定公网地址 前言 本文主要介绍如何在安装了CasaOS的玩客云主机中部署小雅AList,并在AList中挂…

原来Stable Diffusion是这样工作的

stable diffusion是一种潜在扩散模型,可以从文本生成人工智能图像。为什么叫做潜在扩散模型呢?这是因为与在高维图像空间中操作不同,它首先将图像压缩到潜在空间中,然后再进行操作。 在这篇文章中,我们将深入了解它到…

23中设计模式之一— — — —命令模式的详细介绍

命令模式 Command Pattern讲解 概念描述模式结构主要角色模式的UIM类图模式优点模式缺点应用场景实例演示类图代码演示运行结果 概念 命令模式(别名:动作,事务) 命令模式是一种行为设计模式,将一个请求封装为一个对象…

内网-2(代理)

一、代理概述 1、代理服务器(proxy server):代理网络用户去取得网络信息,介于浏览器与web服务器之间的一条服务器。 注:为了方便,以下用B来代表浏览器的主机,S来代表服务器的主机。 2、正向代理和反向代理 正向代…

shell(一)

shell 既是脚本语言又是应用程序 查看自己linux系统的默认解析:echo $SHELL 创建第一个shell 文件 touch 01.sh编辑 vi 01.sh01.sh 文件内容 #!/bin/bash echo felicia保存 按Esc 然后输入:wq 定义以开头:#!/bin/bash #!用来声明脚本由什么shell解释…

如何在路由器上安装代理服务:详细教程

如何在路由器上安装代理服务:详细教程 步骤一:通过漏洞进入路由器系统开启Telnet服务使用Telnet登录路由器系统查看系统信息和CPU信息步骤二:交叉编译MIPS程序 Go对MIPS的支持 安装TFTP Server使用BusyBox tftp传输文件在路由器系统中下载编译…

Linux.小技巧快捷键

1. ctrl c 强制停止 终止某些程序的运行 也可以取消某行命令 2. ctrl d 退出或登出 进入python环境中,使用ctrl d 退出 3.history 查看历史使用了哪些命令 4. ! 历史最近使用的命令的开头 5.使用ctrl r 搜索历史使用的命令 按下 ctrl r 会进入 reverse -…

GIS赋能低空经济:开辟天空新蓝海

在21世纪的科技浪潮中,低空经济作为新兴业态正悄然崛起,成为继陆地、海洋之后的又一战略要地。本文旨在探讨GIS如何赋能低空经济,推动无人机应用、空中交通管理、低空物流、城市空域规划等领域的发展,开启天空经济的新纪元。 GIS…

Xmind Pro 2024 专业版激活码(附下载链接)

说到思维导图,就不能不提 Xmind。这是一款优秀的思维导图工具,拥有着丰富的导图模板,漂亮的界面和配色,以及各种各样的创意工具。 新架构速度更快 采用全新 Snowdancer 引擎,一种堪称「黑科技」的先进图形渲染技术。…

CrawlSpace爬虫部署框架介绍

CrawlSpace爬虫部署框架介绍 全新的爬虫部署框架,为了适应工作的爬虫部署的使用,需要自己开发一个在线编写爬虫及部署爬虫的框架,框架采用的是Django2.2bootstap依赖scrapyd开发的全新通用爬虫在线编辑部署及scrapy项目的部署框架。项目实现的…

VCRUNTIME140_1.dll是什么?VCRUNTIME140_1.dll缺失的7个不同解决方法详解

vcruntime140_1.dll是Microsoft Visual C 2015运行时库的一部分,它为使用Visual C 2015编译的应用程序提供了必要的运行时支持。该文件包含多个关键的运行时组件,包括标准模板库(STL)、C异常处理、内存管理等。 功能: vcruntime140_1.dll确保应用程序能…

在人工智能背景下,程序员要有什么职业素养,怎么改进

文章目录 1. 持续学习和适应能力原因改善方法 2. 跨学科知识原因改善方法 3. 高效的计算资源利用原因改善方法 4. 模型解释性和可控性原因改善方法 5. 数据隐私和安全意识原因改善方法 在AI大模型的背景下,程序员要有什么职业素养,怎么改进,才…

电流继电器JL-31 柜内固定安装 约瑟JOSEF

JL系列电流继电器型号: 电流继电器JL-31 电流继电器JL-31C/1 电流继电器JL-31A 电流继电器JL-31/B 电流继电器JL-32BP 电流继电器JL-22 电流继电器JL-21 电流继电器JL-21B 电流继电器JL-23 电流继电器JL-11 电流继电器JL-11/2G 电流继电器JL-11C 电流继电器J…

5.23.3 乳腺癌成像中的深度学习:十年的进展和未来方向

乳腺影像学在早期诊断和干预以改善乳腺癌患者的预后方面发挥着重要作用。在过去的十年中,深度学习在乳腺癌成像分析方面取得了显着进展,在解释乳腺成像模式的丰富信息和复杂背景方面具有巨大前景。 基于深度学习的乳腺癌成像研究涵盖了对乳房X光检查、超声、磁共振成像和数字…

无人机推流/RTMP视频推拉流EasyDSS无法卸载软件是什么原因?

视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务,在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外,平台还支持用户自行上传视频文件,也可将上传的点播…

记Codes开源免费研发项目管理平台——流程驱动缺陷管理的创新实现

继上一回合日报与工时融合集中式填报的创新实现后,本篇我们来讲一讲流程驱动缺陷管理的创新实现。 肯定会有人说,不就缺陷管理嘛!几个状态完事,爱咋整就咋整,没必要搞流程化,搞流程就是把简单事情复杂化。 …

ViewModel原理分析

认识 ViewModel ViewModel 是一种用来存储和管理UI相关数据的类。 ViewModel 的作用可以从两个方面去理解: UI界面控制器:在最初的MVC模式中,由于 Activity / Fragment 承担的职责过重,因此在后续的 MVP、MVVM 模式中&#xff…

iOS 通过PacketLogger 抓包蓝牙数据包

当使用iOS平台调试蓝牙外设时,需要抓取蓝牙数据包,那么如何获取iOS端设备与蓝牙设备之间通信的蓝牙数据包呢? 一、资料准备 1、苹果手机 2、Xcode开发工具 3、Apple开发者账户 二、环境搭建 2.1、手机环境搭建 手机浏览器访问地址&…

nginx: [error] invalid PID number ““ in “/run/nginx.pid“

两种问题,我自己碰到的情况 ./nginx -s reload执行命令后报错 nginx: [error] invalid PID number ““ in “/run/nginx.pid“ 第一种情况,pid被注释了 /usr/local/nginx/conf/nginx.conf #user nobody; worker_processes 1;// 可能是这里被注释了…

吴恩达2022机器学习专项课程C2W2:2.23 选修_反向传播算法的工作原理(什么是导数图计算大型神经网络)

目录 引言一.导数的计算1.epsilon与导数的关系2.其它导数符号形式3.导数小结 二.小型神经网络的计算图1.什么是计算图(前向传播过程)2.反向传播计算过程3.验证反向传播的计算结果4.为什么用反向传播计算导数? 三.扩大神经网络的计算图1.计算反…