Django实时选项(Websockets,flash,轮询)是什么?

9
有哪些可以作为Python包安装的Django实时“推送”选项? 我想避免像安装独立的Web服务器这样的事情来实现实时性。 实质上,我正在寻找像pusher.com(云系统)或this socket.io build for django这样的东西(其构建状态为:失败),用于聊天和其他各种推送操作。
这里建议使用Ape here,但它似乎需要您将Ape设置为服务器。 如果不太麻烦,是否有任何可以直接构建到Django中的解决方案?
3个回答

6
自从这篇答案写出来(2012年)以来,很多事情发生了变化。现在进行实时系统更新的首选方法是使用WebSockets;它正在被正式化并提议为标准RFC 6455MDN上的这个页面对该技术有很好的概述。另一种新兴技术是服务器发送事件(Server Sent Events),它是一个W3C草案提案。像swampdragondjango-socketio这样的项目使得在您的项目中集成实时功能更加容易。
任何实时系统都有两个主要组成部分:
  1. 从浏览器到服务器保持打开的连接。
  2. 监听此连接并响应的服务器。
  3. 存储和通知消息的系统/标准。
好吧,也许是三个组件。
由于Django不支持实时处理,因此任何提供实时推送/更新的解决方案都需要另一个服务器/服务来接受消息,然后通知待处理的消息的侦听器。
Django将是将消息(写入)推送到此通道(队列/桶)上的应用程序。然后,侦听器订阅通道以通知消息。由于连接保持打开状态;消息是“实时”检索的。
在所有这些过程中,Django的作用非常小。有各种实现可提供实时通知所需的三个组件。
我真的很喜欢juggernaut,因为它非常简单易用,并且使用node.js,不需要太多服务器端组件。我喜欢它的另一个原因是它支持Adobe Flash Socket以及WebSocket(和其他协议,请参见链接)。
访问它的API也非常简单-事实上,如果您已经在使用Redis(因为它易于使用),则不需要另一个API,因为您可以将消息放入Redis并且Juggernaut将读取它们,或者您可以使用其Python API。 以下是来自此Flask片段的简单示例:
向频道发送(写入)消息:
>>> 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>

1
Django 是用于服务网页的,没有直接支持 websockets 的功能。最快/最简单的选择是 pusher.com(我使用它并且很喜欢)。您可以从 pusher.com 开始,如果您编写一个快速的包装器来连接新服务器,您可以将其替换为使用 socket.io 或任何其他 websocket 服务器的自己的服务器,只需更改包装器/接口即可。请确保编写代码时能够随时切换后端。
如果您真的想要启动自己的套接字服务器,那么有一些项目可以让在 Django 中使用套接字变得容易:

请注意,django-websocket 在生产环境中存在一些限制。而 django-socketio 已经不再维护。 - Patrick Bassut
@PatrickBassut,Django与WebSockets结合以实现实时数据的更好选项是什么? - shaik moeed

0

你实际上可以从Tornadio2提供Django,这是Tornado中socketio的工作实现。如果你想在你的实时应用程序中构建任何程度的复杂性,你可能需要一个redis pubsub后端,将会话映射到通道并处理多播。为此,你可能需要看一下Brukva。还要阅读Yuval Adam的博客文章。最后,Tony Abou Assaleh的示例包文章将为设置tornadio2提供有用的基础参考。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接