Django Channels 原理

      Django Channels 是一个为 Django 提供异步扩展的库,通常主要用来提供 WebSocket 支持和后台任务。

原理

它的原理是将 Django 分为 2 种进程类型:

  • 一个用于处理 HTTP 和 WebSocket 的协议服务
  • 一个用于运行视图、WebSocket handler 以及后台任务的 worker 服务

两者通过 ASGI 协议通信,类似与 WSGI 但是运行在网络层上,并且支持更多协议。

Django Channels 并没有引入 asyncid、gevent 或者其它异步库,所有业务逻辑都在同一个业务进程/线程中同步运行。

细节请阅读 Django Channels docs/concepts

前提

想要运行 Django Channels 首先需要一个 ASGI 服务器,比如 Daphne,使用 Django worker 服务器运行:./manage.py runworker,以及 ASGI 请求的通道服务,比如 Redis。

即使启用 channels,所有的 HTTP 请求依旧是默认经过 Django 视图系统,因此可以无缝迁移过来。

好处

  • 易用的支持数以千计客户端的 HTTP long-poll 支持
  • 类似 Django 原生的 WebSocket 的会话和验证支持
  • 自动根据 cookie 为 WebSocket 提供登录
  • 大量事件触发底层支持
  • 0 宕机部署支持
  • 特定 URL 的底层 HTTP 控制
  • 可扩展支持其它协议或者事件源(例如 WebRTC、UDP、SMS)
  • Django 的官方支持

基本概念

channel

Django Channels 的核心数据解构叫做 channel,它是一个有序的 FIFO 队列,支持信息过期,对于一个监听器至多投递一次。类似于任务队列──信息由 producer 投递至 channel,并设置一个 consumer 监听该 channel。

注意消息投递是至多一次,因此遇到应用崩溃等情况会导致消息丢失。

Django Channels 的理念和 Go 语言内置的 channel 概念类似,不同之处在于 Django Channels 是网络透明的,因此 producer 和 consumer 通信可以穿越不同机器。在同一个网络中,Django Channels 的频道是根据名称属性区分的,如果你向一个名为 http.request 的 channel 发送信息,都是发送向同一个 channel。而对于不同网络中则不一样,channel 是网络隔离的。

consumer

“consumer”(消费者)是 channels 架构中处理请求的部分,和 Django 有 view 函数和 ViewClass 一样,consumer 也支持类式写法。例如你要处理 WebSocket 请求,可以实现一个 WebsocketConsumer 的子类,并通过 route_class 函数将该 consumer 与 URL 连接起来。

consumer 函数
consumer 类
from channels.generic.websockets import WebsocketConsumer

class MyConsumer(WebsocketConsumer):
    http_user = True         # 设置为 ``True`` 将会自动从 HTTP cookie 中登录用户,因此可以省去 channel_session_user 的设置。
    strict_ordering = False  # 默认设置

    def connection_groups(s
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值