Django Websocket

Django isn't supported websockt by default!

在十几年前,网站并不复杂,绝大部分网页都是静态页面。以数据库为后端、mvc架构的web应用是夺人眼球的事物,但是现在,依靠ajax获得全部相关数据的单页面web应用也已经随处可见。当然,随处可见的还有依靠websocket实现的实时的web应用。

Django 作为有十几年年龄的web框架,它的内核是基于简单的请求-响应概念建成的:浏览器发出一个请求,Django 接收到后调用一个相应的 view 函数,该函数会返回一段响应数据,然后 Django 将这段数据发送回浏览器。

nil

这不适用于WebSockets!view 仅存在于单个请求的生命周期,并没有机制去处理 打开一个连接发送数据给没有相关联的特定的一个客户端

Django Channels

It replaces the "guts" of Django

Django Channels 用经过 channels 的 messages 替代了请求/响应循环。Channels 允许 Django 用一种非常类似于传统HTTP views 的方式支持 Websocket。HTTP 请求仍旧如以前那样处理,除了会在 channels 上路由。

nil

Concepts

channel 是一个有序的fifo队列,其中的 messages 有超时机制并且最多只能成功地被发送给一个监听者。

你可以在逻辑上认为它是一个任务队列 —— messages 被生产者放进 channel,然后被发送给监听这个 channel 的一个消费者。

channels 有容量,所以即使在没有消费者时,许多生产者也能够写很多 messages 到 channel 里,并且一个之后而来消费者能够得到并处理哪些排队中的 messages。

如果你用过 Golang 中的 channels1,你就会发现 Django channels 与 Go channels 相当相似。其中关键的不同在于:Django channels 的实现是全部通过网络去访问消费者,而生产者运行在不同的进程中或不同的机器上。

在网络上,我们通过唯一的名字字符串识别各个 channels 。如果两台不同的机器都往 http.request channel 写数据,那么他们其实正写入到同一个 channel 中。

Footnotes: