Django 的实时选项(Websockets、flash、轮询)?

Posted

技术标签:

【中文标题】Django 的实时选项(Websockets、flash、轮询)?【英文标题】:Realtime options (Websockets, flash, polling) for Django? 【发布时间】:2012-04-05 19:05:18 【问题描述】:

django 有哪些实时“推送”选项可以安装为 python 包?我想避免做一些事情,比如实时安装独立的网络服务器。

基本上我正在寻找类似 pusher.com(云系统)或 this socket.io build 的 django(构建状态为:失败),用于聊天和其他各种推送操作。

建议使用 Ape here,但似乎需要您将 Ape 设置为服务器。如果要求不高,有没有可以直接构建到 django 中的解决方案?

【问题讨论】:

【参考方案1】:

自编写答案以来(2012 年);很多东西都变了。

现在进行系统实时更新的首选方法是使用 websockets;它正在正式化并被提议为标准RFC 6455。 This page on MDN 对该技术有很好的概述。

另一种新兴技术是Server Sent Events,即W3C draft proposal。

swampdragon 和 django-socketio 等项目可以让您更轻松地在项目中集成实时功能。


任何实时系统都有两个主要组件:

    从浏览器到服务器的连接保持打开状态。 侦听此连接并做出响应的服务器。 用于存储和接收消息通知的系统/标准。

好吧,也许三个组件。

由于 django 不能实时工作,任何提供实时推送/更新的解决方案都需要另一个服务器/服务来接受消息,然后通知侦听器待处理的消息。

Django 将是在通道(队列/存储桶)上将消息推送(写入)到此服务器的应用程序。侦听器然后订阅一个频道以接收消息通知。由于连接保持打开状态;消息是“实时”检索的。

Django 在这一切中的作用确实很小。有多种实现提供实时通知工作所需的三个组件。

我真的很喜欢juggernaut,因为它设置起来超级简单,并且使用在服务器端组件方面不需要太多的node.js。我更喜欢它的另一个原因是它除了支持 WebSocket 之外还支持 Adob​​e Flash Socket(以及其他,请参阅链接)。

访问它的 api 也非常简单 - 事实上,如果你已经在使用 redis(你真的应该使用它,因为它的 so easy to use),你不需要另一个 API,因为你可以将消息发送到 redis 和 juggernaut 将阅读它们,或者你可以使用它的 Python API。来自flask snippet 的一个简单示例:

向频道发送(写入)消息:

>>> from juggernaut import Juggernaut
>>> jug = Juggernaut()
>>> jug.publish('channel', 'The message')

听一听:

<script type=text/javascript
  src=http://localhost:8080/application.js></script>
<script type=text/javascript>
  var jug = new Juggernaut();
  jug.subscribe('channel', function(data) 
    alert('Got message: ' + data);
  );
</script>

【讨论】:

【参考方案2】:

Django 是为网页服务而构建的,在 django 中没有开箱即用的东西来支持 websockets。最快/最简单的选择是 pusher.com(我非常喜欢它)。您可以从 pusher.com 之类的东西开始,如果您围绕它编写一个快速包装器,您可以使用 socket.io 或任何其他 Web 套接字服务器将其替换为您自己的服务器,只需更改包装器/接口以连接到新服务器.只要确保您编写它时能够随时切换后端即可。

如果你真的想开始运行自己的套接字服务器,那么有一些项目可以让你在 django 中轻松使用套接字:

django-websocket django-socketio

【讨论】:

请注意,django-websocket 在生产中使用时有几个限制。并且不再维护 django-socketio。 @PatrickBassut Django 使用 WebSockets 处理实时数据的更好选择是什么?【参考方案3】:

您实际上可以从Tornadio2 提供 Django,这是 Tornado 中 socketio 的工作实现。如果您想在您的实时应用程序中构建任何程度的复杂性,您可能需要一个将会话映射到通道并处理多播的 redis pubsub 后端。为此,您可能想看看Brukva。还请阅读 Yuval Adam 的 blog post 关于这个主题。最后,Tony Abou Assaleh 的 sample package 和 post 将在为 django 设置 tornadio2 时提供有用的基础参考。

【讨论】:

以上是关于Django 的实时选项(Websockets、flash、轮询)?的主要内容,如果未能解决你的问题,请参考以下文章

通过 Django Channels 和 Websockets 向客户端推送实时更新

Websockets 和 python django

多个独立的 websockets 连接

具有实时和 WebSockets 的 Angular2 + Laravel

WebSockets 或 Http 哪一个用于实时应用程序?

Django、websockets、Tornado,如何让它们通信?