Django Channels:给 Django 加上实时通信能力

Django 用户可能都遇到过这个问题。项目做得好好的,突然要加 WebSocket 支持,做消息推送或者在线通知。翻了一圈第三方方案,要么太重,要么不够稳定。Channels 就是官方给出的答案。

Channels 目前在 GitHub 上有 6300 多 Star,由 Django 官方维护。它让 Django 具备 WebSocket 支持,同时保留了原有的开发体验。路由系统还在,中间件还在,视图层换成 consumer 的概念,写法类似。

WebSocket 和普通 HTTP 请求的区别在于连接是持久的。客户端和服务端建立一个 TCP 连接后,两边随时可以发数据。对聊天应用、协作编辑、游戏服务端、实时数据看板来说,这是刚需。

正文顶部截图

Channels 的架构

Channels 的核心思路是在 Django 之上加一层 ASGI 支持。Django 原本用 WSGI,只能处理同步的 HTTP 请求。ASGI 是 WSGI 的升级版,支持异步,也支持 WebSocket 等多种协议。

迁移到 Channels 不需要重写项目。原来用 Django Rest Framework 写的 API 可以继续跑,新增的 WebSocket 路由单独配置就行。

Channels 的架构分三层。顶层是接口服务器,官方推荐 Daphne,负责接收 HTTP 和 WebSocket 连接。中间是通道层,相当于消息路由器,决定每个消息分发到哪里。底层是后端实现,开发时可以用内存 backend,生产环境通常用 Redis。

这种分层的好处是每层可以独立替换。不想用 Daphne 可以换 Uvicorn 或 Hypercorn,不想用 Redis 可以换其他消息队列。

能做什么

Channels 最常见的场景是聊天室。用户打开页面后和服务器建立 WebSocket 连接,发消息时通过通道层广播给所有在线用户。同样的逻辑可以扩展到消息通知、协作编辑、实时投票。

第二个场景是后台任务。耗时操作丢到后台异步执行,不阻塞 HTTP 请求。比如用户上传文件后,服务端异步处理,处理完通过 WebSocket 通知用户。

第三个场景是自定义协议。ASGI 协议本身不限于 HTTP 和 WebSocket,有需要可以自己实现其他协议的支持。

Channels 的配套项目也很完整。Daphne 负责 HTTP 和 WebSocket 的协议处理,是生产环境的推荐网关。channels_redis 提供基于 Redis 的通道层后端,支持多个服务实例之间的消息广播。asgiref 是底层的 ASGI 基础库,包含内存后端和同步转异步的工具函数。三个项目配合使用,可以搭建完整的实时应用。

README区域截图

上手体验

安装和配置流程清晰。pip 装好 channels,把项目入口从 WSGI 改为 ASGI,新增 routing 配置和 consumer 类就行。官方提供了完整的教程,从安装到部署一步步都有,新手跟着走一遍大概两三个小时能跑通。

Channels 要求 Python 3.10 以上,兼容 Django 5.2 以上。如果项目用的 Django 版本比较老,需要先升级。

维护方面,项目由 Django 核心成员 Carlton Gibson 负责。安全问题和功能需求走 Django 官方渠道,不用担心没人维护。

适合谁

如果你在用 Django 做 Web 项目,突然需要加实时消息功能,Channels 是风险最低的选择。不需要换框架,不需要引入新的消息中间件,在现有 Django 项目里加几层配置就行。

如果你刚接触 Django,想做个带实时功能的项目练手,官方教程的起点也足够低。

Channels 解决的痛点是真实存在的。Web 应用发展到今天,实时通信已经不是锦上添花的需求。Django 能在自己的生态里有一个官方支持的实时通信方案,对它的用户来说是件好事。

花的需求。Django 能在自己的生态里有一个官方支持的实时通信方案,对它的用户来说是件好事。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐