Django WebSocket Channel Redis

Python异步编程避坑指南:Channels与Redis配置的那些常见错误 本文深入解析Python异步编程中Channels与Redis集成的7个常见陷阱及解决方案,涵盖版本兼容性、配置错误、连接失败等关键问题。特别针对Django项目中的WebSocket实时通信场景,提供生产环境部署优化建议和性能调优技巧,帮助开发者规避异步编程中的典型错误。 阅读详情

?目的:实现有新模型创建的时候自动通知浏览器刷新模型列表
本例子实现了,在admin新上传一个文档的时候,通知客户端

盗用一张介绍Websocket的图

clipboard.png

1. 建一个 Django 项目,或者下载我的 Django base 项目
git clone git@github.com:chunkai-meng/base-django.git
2. 安装 channels 和 channels-redis
cd base-django/proj
pipenv install channels channels-redis

docker run --name websocket-redis -p 6379:6379 -d redis
3. 加入 Channel 到 INSTALLED_APPS & 添加 CHANNEL_LAYERS 到 settings
# settings.py
INSTALLED_APPS = [
    'channels',
    # ...
]

....
ASGI_APPLICATION = "proj.routing.application"

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("localhost", 6379)],
        },
    },
}
4. Code files
  1. proj/routing.py - already mentioned in settings.py as ASGI_APPLICATION, which direct all the WebSocket request to the right consumers.
from channels.routing import ProtocolTypeRouter, URLRouter
from django.urls import path
from notification.comusers import NotificationConsumer

application = ProtocolTypeRouter({
    "websocket": URLRouter([
        path("notifications/", NotificationConsumer),
    ]),
})
  1. notification/consumers.py - an action handler to establish handshake, receive and send msg to the client.
from channels.generic.websocket import AsyncJsonWebsocketConsumer


class NotificationConsumer(AsyncJsonWebsocketConsumer):
    async def connect(self):
        await self.accept()
        await self.channel_layer.group_add('gossip', self.channel_name)

    async def disconnect(self, code):
        await self.channel_layer.group_discard('gossip', self.channel_name)

    async def name_gossip(self, event):
        await self.send_json(event)
  1. document/signals.py - a hook to send msg to the channel listened by consumer
from .models import Document
from django.db.models.signals import pre_save
from django.dispatch import receiver
from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer


# hook to be called whenever a Document is saved.
@receiver(pre_save, sender=Document)
def notify_post_save(sender, **kwargs):
    if "instance" in kwargs:
        instance = kwargs["instance"]
        channel_layer = get_channel_layer()
        async_to_sync(channel_layer.group_send)(
            "gossip", {
                "type": "name.gossip",
                "event": "New Document",
                "sender": instance.owner.username,
                "message": instance.name
            }
        )
  1. document/apps.py - register the signal when the app is ready
from django.apps import AppConfig


class DocumentConfig(AppConfig):
    name = 'document'
    verbose_name = 'Documents'
    def ready(self):
        import document.signals

image.png

websocket_test.png

个人理解:

  1. Channel 是个管道,用来异步传递消息,需要 pip install
  2. Redis 是后端,要启动好,并且 localhost:6379 能访问,反正要跟设置里的一致
  3. Settings 里定义了 WebSocket 的请求都去找 routing.py
  4. routing.py 里定义了 一个 consumer 路径在 notifications/ 所以一会 WebSocket 客户端要去访问这里
  5. NotificationConsumer 就是一个标准的 Consumer
  6. notify_post_save 是一个测试用的钩子,目的是异步的出发消息发送到 Channel,然后回给客户端

有不对的地方欢迎留言

django channels 的使用和配置 以及实现简单的群聊 1.1WebSocket原理 http协议 连接 数据传输 断开连接 websocket协议,是建立在http协议之上的。 连接,客户端发起。 握手(验证),客户端发送一个消息,后端接收到消息再做一些特殊处理并返回。 服务端支持websocket协议。 1.2django框架 django默认不支持websocket,需要安装组件: pip install channels 配置: 注册channe 阅读详情

相关推荐

Django Channels底层原理与高并发实战指南

WebSocket是现代实时Web应用的核心通信协议,而ASGI作为Python异步服务的标准网关接口,为Django等传统同步框架提供了向异步演进的桥梁。Django Channels正是基于ASGI构建的官方实时扩展,它通过分层解耦设计(HTTP/WS路由分离、Channel Layer消息总线、异步消费者模型)实现可扩展的实时能力。其技术价值在于平衡开发效率与生产级性能——既复用Django生态,又支持万级并发连接;典型应用场景包括在线协作、直播弹幕、实时通知系统等。本文聚焦Channels的底层机制

weixin_32075843的博客 334

django channels的redis数据库搭建,Windows系统

前言 准备做一个web视频聊天,这两天学习了django channels实现websocket,之后再学习webrtc。 看了些django channels的博客教程搭建简单的聊天室,只能说走了不少弯路,因为我看的两个人的都不全,一个缺少必要的头文件,一个还使用母版,我只是想熟悉下流程啊,用的着这么复杂吗? 这才跟着官网文档走了一遍,早跟着官网就好了。 于是,就来到了channels文档一笔带过的redis服务,现在总算是摸清楚Windows下的redis服务与django如何结合。

xzc的博客 1967

Django校园聊天系统实战:WebSocket与Channels完整解析

实时通信是构建在线聊天系统的核心能力,传统HTTP请求-响应模型无法满足服务端主动推送消息的需求,而WebSocket协议通过长连接实现了真正的双向实时交互。在Django技术栈中,Django Channels作为ASGI扩展,让开发者能够复用熟悉的ORM和认证体系,同时无缝接入WebSocket,实现消息广播、在线状态维护等复杂功能。结合Redis作为Channel Layer后端,系统可以轻松支撑校园场景下数千人同时在线的消息推送。本文以一个校园Chat在线聊天系统项目为切入点,梳理从用户模型设计、好

weixin_31456563的博客 266

Django中如何正确使用 redis & 如何在 Heroku 部署 Django时使用 Redis

你需要在你的配置中指定一个。作为后端来实现此功能。首先确保电脑中安装了。

qq_42902997的博客 1019

channels_redis:用于 Django 通道的 Redis 通道层后端

channel_redis 提供使用 Redis 作为后备存储的 Django Channels 通道层。 有两种可用的实现: RedisChannelLayer是原始层,它自己实现通道和组处理。 RedisPubSubChannelLayer更新并利用 Redis Pub/Sub 进行消息分发。 该层目前处于Beta状态,这意味着它在成熟时可能会发生重大变化。 两层都支持单服务器和分片配置。 注意:这个包的先前版本被称为asgi_redis ,如果你需要它们用于 Channels 1.x 项目,它仍然可以在 PyPI 下以该名称使用。 此软件包仅适用于 Channels 2 项目。 用法 在 Django 设置文件中设置通道层,如下所示: CHANNEL_LAYERS = { "default": { "BACKEND": "channels_re

【清风数学建模笔记】第十一讲:时间序列分析

【清风数学建模笔记】第十一讲:时间序列分析

manerzi的博客 832

channels_redis 配置

CHANNEL_LAYERS = { "default": { "BACKEND": "channels_redis.core.RedisChannelLayer", "CONFIG": { "hosts": [("localhost", 6379)], }, }, }   CHANNEL_LA

hllyzms的博客 5302

彻底解决0x80070005错误代码:全面分析与实战指南

0x80070005错误代码虽然令人头疼,但通过上述方法,我们完全有能力将其攻克。从检查磁盘空间、设置账号权限,到运行疑难解答和系统文件检查器,再到调整相关服务状态,每一步都是解决这一问题的关键。希望本文能为你提供有力的帮助,让你在使用Windows系统的过程中更加顺畅无忧。

nntxthml的博客 6933

ZMK 本地开发环境搭建指南:容器化(Docker/Podman)与原生(Native)两种方式的完整配置流程

本文以 ZMK 官方文档 [docs/docs/development/local-toolchain/setup/index.md](https://link.gitcode.com/i/2f85ba72ad4352c52c66d82d835cac84) 为主线,系统讲解搭建 ZMK 固件开发环境的两种官方推荐方式:**基于 Docker/Podman 的容器化开发环境**与**直接在操作系统上

gitblog_01035的博客 357

浙政钉H5应用上架实战:从环境配置到发布避坑指南

本文详细解析浙政钉H5应用上架全流程,从环境配置到发布避坑指南。重点介绍Vue 2.6 + Node 14.21.3的稳定开发环境搭建、项目结构规范及常见报错解决方案,帮助开发者高效完成浙政钉H5应用上架流程。

weixin_27943395的博客 286

2023东华大学机试OJ进阶版1-81题

先排序。每次找两个最小的数,把其中一个置为两数之和,并累加这个和值,另一个数置为-1,然后再排序,重复操作,直到只剩下一个数。105。

m0_49263811的博客 2796

Posio开发实战:构建基于Django Channels的异步Websocket服务

Posio是一款基于Django Channels构建的多人地理知识游戏,通过Websocket技术实现实时互动功能。本文将带你深入了解如何使用Django Channels构建高效的异步Websocket服务,为多人在线游戏提供稳定的实时通信支持。 ## 项目概述:实时地理游戏的技术架构 Posio作为一款多人在线地理游戏,核心需求是实现玩家之间的实时互动和数据同步。游戏包含城市定位和国旗识

gitblog_00080的博客 745

基于CutLSTM-ATT 模型的刀具磨损预测-【一个月之内发一篇中文核心辅导】

基于CutLSTM-ATT 模型的刀具磨损预测-【一个月之内发一篇中文核心辅导】

315

实时Web应用开发利器:Django Channels Example中的Redis与ASGI配置指南

Django Channels Example是一个基于Django Channels构建的实时Web应用示例项目,它展示了如何利用ASGI和Redis实现WebSocket通信功能。本指南将带你了解如何在项目中配置Redis与ASGI,轻松搭建高性能的实时Web应用。 ## 📋 什么是Django Channels? Django Channels是Django框架的扩展,它引入了ASGI

gitblog_00315的博客 329

费雪的未来增长评估:预测颠覆性技术的影响

本文旨在提供一个系统性的框架,用于评估和预测颠覆性技术的增长轨迹。我们将重点关注费雪增长模型(Fisher-Pry Model)这一经典技术扩散理论,探讨其在现代技术预测中的应用价值。文章首先介绍费雪增长模型的基本概念,然后深入其数学原理和算法实现。随后展示实际应用案例,讨论工具资源,最后探讨未来发展趋势。每个部分都包含详细的技术实现和理论分析。费雪增长模型(Fisher-Pry Model):一种描述技术替代过程的S型增长模型,用于预测新技术取代旧技术的速率。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 928

【WorkBuddy专栏27】WorkBuddy 和 CodeBuddy 到底什么关系——一篇文章终结所有混淆

WorkBuddy 和 CodeBuddy 到底什么关系——一篇文章终结所有混淆

AI人人懂 2663

【Django DRF Apps】从零搭建一个webSocket Django App

从零开始搭建了一个支持 WebSocket 的 Django 应用。关键点是安装和配置Channels、使用ASGI替代WSGI来支持异步操作,并通过 Redis 实现多客户端的实时消息推送。

qq_59344127的博客 1467

最新Python爬虫实战(入门爬虫篇)——案例1:某瓣网站Top250图片数据采集(附上完整爬虫代码)

本次案例通过Python爬虫技术实现了某瓣Top250电影封面的批量下载。代码采用模块化设计,函数实现cookies的自动解析,简化了配置流程,涵盖请求、解析、存储的完整流程。学习重点包括:抓包工具定位数据源、正则表达式匹配图片链接、模拟请求头绕过反爬机制、以及自动化文件管理。需要注意控制请求频率并遵守网站使用规范,适用于入门爬虫实践。

努力让自己发光,对的人才能迎着光而来 16万+

Django Channels实战:基于WebSocket的异步聊天室开发指南

本文详细介绍了如何使用Django Channels和WebSocket技术构建实时异步聊天室。内容涵盖从环境搭建、核心配置到编写WebSocket Consumer的完整流程,并深入讲解了如何实现点对点私聊与多人聊天室功能,最后提供了生产环境部署与性能优化要点,是开发者掌握Django实时应用开发的实战指南。

cream的博客 484

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

django-channels-chat核心组件解析:Consumers与Channel Layer实战

django-channels-chat是一个基于Django Channels构建的简单Web聊天应用,它利用异步通信技术实现了实时消息传递功能。本文将深入解析该项目的核心组件——Consumers和Channel Layer,帮助开发者快速掌握Django Channels的实战应用。 ## 一、Consumers:实时通信的处理核心 Consumers是Django Channels中的

gitblog_00893的博客 295

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

在Django5中使用Websocket进行通信

使用Django5和Websoket,开发一个简单的聊天室应用

未来已来,AI时代,学AI编程,做AI量化,就来大鹏AI教育。 1800

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Django Channels 终极指南:实现多用户实时聊天室

想要为你的 Django 应用添加实时通信功能吗?Django Channels 正是你需要的解决方案!🚀 本文将带你深入了解如何利用 Django Channels 构建一个功能完整的多用户聊天室。Django Channels 是基于 ASGI 规范的 Django 扩展,专门用于处理 WebSocket、长轮询等实时协议,让传统的同步 Django 应用也能轻松实现实时双向通信。 ##

gitblog_00508的博客 530

Channels集成到Django消息实时推送

channel架构图 InterFace Server:负责对协议进行解析,将不同的协议分发到不同的Channel Channel Layer:频道层,可以是一个FIFO队列,通常使用Redis Django中配置Channel: CHANNEL_LAYERS的配置: CHANNEL_LAYERS = { "default": { "BACKEND": "...

HarvardFly的博客 2242

Django Channels实战:手把手教你用WebSocket实现实时聊天室(附完整代码)

本文详细介绍了如何使用Django Channels和WebSocket技术构建高性能实时聊天室。从环境准备、核心配置到功能实现,提供了完整的代码示例和部署指南,帮助开发者快速掌握异步通信技术,适用于即时通讯、实时通知等场景。

weixin_30275415的博客 291

Django channels

Django channel http发送消息:客户端请求服务器接口,服务器接口返回客户端需要的数据,一个回合短连接 websocket发生消息:基于tcp,先形成一个长连接,客户端与服务器可以一直通信,只要连接不断开。 Django channel 是使用websocket发送信息,基于asgi协议。 websocket 测试工具:http://www.blue-zero.com/WebSock...

weixin_42009030的博客 1269

django之websocket(基于redis服务器与Channels实现)

一、Channels介绍 Channels改变Django在下面和通过Django的同步核心编织异步代码,允许Django项目不仅处理HTTP,还需要处理需要长时间连接的协议 - WebSockets,MQTT,chatbots,amateur radio等等。 它在保留Django同步和易用性的同时实现了这一点,允许您选择编写代码的方式 - 以Django视图,完全异步或两者混合的方式同步。...

weixin_30561177的博客 571
上一篇: 10 社交网络
真的CK
博客等级 码龄23年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值