【问题标题】:Live notification/chat in djangodjango中的实时通知/聊天
【发布时间】:2015-01-11 20:44:25
【问题描述】:

我现在正在用 django 制作一个网站,我想实现一个实时通知功能,比如 facebook 或 SE 上的那个。

我做了一些研究,似乎有两种选择:ajax 长轮询和 websockets,后者是要走的路。

但是,正如您所知,websocket 'socket.io' 的 go to plugin 原来是一个 node.js 插件,而 django 端口似乎只支持 python 2,而且该项目似乎已经死了。我正在使用 python 2.7 作为我的项目解释器,但我想在未来证明自己,以便以后升级到 python3 时,我不会发现自己无法使用此功能。

所以我的问题是: 是否有一种直接且面向未来的方式来实现 websocket,该方式将用于在 django env 中发送实时通知和聊天?

【问题讨论】:

    标签: django websocket


    【解决方案1】:

    Django 本身是以阻塞方式构建的,即使用 同步 方法。因此,您不能使用 django 应用打开持久性 websocket,因为它会阻塞整个 django 线程。

    如果你想在 django 项目环境中启用通知/聊天,我建议使用centrifuge。它是用python编写的,但是使用了异步(非阻塞)框架:tornado

    但是,您甚至不需要知道它是如何工作的,因为它提供了简单的 REST api 来与之通信。

    简化的工作流程,查看docs了解更多详情:

    1. 在与您的 django 项目相同的服务器上启动 centrifuge(或在另一个服务器上,但它们之间的延迟较低)
    2. 您的前端将使用离心机打开 websocket,而不是使用 django 项目。
    3. 当您需要发送通知时,通过 REST api 从 django 发送到 centrifuge,centrifuge 会发送给需要的客户!

    我已经试过了,效果很好!

    【讨论】:

    • 这似乎是一个可行的解决方案。非常感谢:)
    • @DavidW。没试过,但根据docs 可以在heroku上运行离心机
    • 对此答案的注意事项:当客户端写入 Websocket 时,Centrifuge 无法通知 Django 项目。新的用户生成的内容必须以标准方式发送到 Django 后端 - 即通过 AJAX 或正常的 POST 请求 - 然后数据应该在你的 Django 应用程序中验证,可能像往常一样保存到数据库中,然后你可以将消息发送到 Centrifuge 和这个消息将被广播给所有客户端。完全不使用 Django 后端也可以创建 Websocket 应用程序 - 但这是一种罕见的情况,因为通常我们需要处理新数据(检查权限、验证、保存)
    • @AlexEmelin 谢谢,更新了答案。只是想,如果我们打开“is_watching”项目标志,那么我们可以通过 REST api 接收这些消息。但现在我明白了,它只会显示在离心机网页界面中。
    • 离心机项目不再维护。他们已将其迁移到 Go 语言,现在将其称为 Centrifugo。
    【解决方案2】:

    我认为您必须选择Firebase,它为您提供了出色的同步以及您将如何在前端使用聊天,因此它不必对 django 环境做任何事情,因此您可以使用 firbase 在回调中更新您的后端异步.此外,带有 AngularJS 的 firebase 还为您提供了非常棒的三向绑定。

    【讨论】:

      【解决方案3】:

      Django 没有提供你正在寻找的开箱即用的东西。您必须使用第三方库。跨框架工作的一种是Pusher

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-27
        • 2012-05-03
        • 2016-02-25
        • 2016-10-23
        • 1970-01-01
        • 2011-09-28
        相关资源
        最近更新 更多