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 之外还支持 Adobe 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 的 Angular2 + Laravel