Django的实时选项(Websockets,flash,polling)?

时间:2012-04-05 19:05:18

标签: python django websocket real-time

什么是django可以作为python包安装的实时“推送”选项?我想避免不必像实时安装独立的Web服务器那样。

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

Ape被建议here,但似乎需要您将Ape设置为服务器。如果它没有太多要求,是否有任何解决方案可以直接进入django?

3 个答案:

答案 0 :(得分:6)

答案撰写时间(2012年);很多都改变了。

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

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

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


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

  1. 从浏览器到服务器的打开连接。
  2. 侦听此连接然后响应的服务器。
  3. 存储和收到消息通知的系统/标准。
  4. 好的,也许是三个组成部分。

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

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

    Django在所有这些方面确实扮演了最小的角色。有各种实现提供实时通知工作所需的三个组件。

    我非常喜欢juggernaut,因为它设置起来非常简单,并且使用的node.js在服务器端组件方面并不需要太多。我更喜欢它的另一个原因是它支持Adobe Flash Socket以及WebSocket(以及其他人,请参阅链接)。

    访问它的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>
    

答案 1 :(得分:1)

Django是为了提供网页服务而设计的,没有任何东西可以支持django中的websockets。最快/最简单的选择是pusher.com(我真的喜欢它)。你可以从像pusher.com这样的东西开始,如果你在它周围编写一个快速包装器,只需更改包装器/接口以连接到新服务器,就可以使用socket.io或任何其他Web套接字服务器将它替换为您自己的服务器。 。只要确保你能够在任何时候切换后端来编写它。

如果你真的想开始运行自己的套接字服务器,那里有项目可以很容易地在django中使用套接字:

答案 2 :(得分:0)

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