Django中的实时通知/聊天

12

我现在正在使用Django制作网站,希望实现类似于Facebook或SE上的实时通知功能。

我进行了一些研究,发现有两种选择:Ajax长轮询和Websockets,而后者是更好的选择。

然而,如您所知,Websocket的首选插件'socket.io'实际上是一个Node.js插件,而Django端口似乎仅支持Python 2,并且该项目似乎已经死亡。我正在使用Python 2.7作为我的项目解释器,但是我希望为自己未来打算,以便如果我将来升级到Python 3,我不会发现自己无法使用此功能。

那么我的问题是:是否有一种简单且面向未来的方法来在Django环境中实现Websocket,用于发送实时通知和聊天?

3个回答

14

Django本身是以阻塞的方式构建的,即采用了同步处理的方法。因此,您无法使用Django应用程序打开持久的WebSocket连接,因为它会阻塞整个Django线程。

如果您想在Django项目环境中启用通知/聊天功能,我建议使用Centrifuge。它是用Python编写的,但使用了异步(非阻塞)框架:Tornado

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

简化的工作流程,请查看文档了解更多细节:

  1. 在与Django项目相同的服务器上启动Centrifuge(或在两者之间延迟较低的另一个服务器上启动)
  2. 您的前端将打开与Centrifuge而非Django项目的WebSocket。
  3. 当您需要发送通知时,从Django通过REST API将其发送到Centrifuge,Centrifuge将把它传递给所需的客户端!

我已经尝试过它,而且它确实有效!


1
这似乎是一个可行的解决方案。非常感谢 :) - Dan
1
@DavidW. 没有尝试过,但根据文档的说法,在Heroku上运行离心机是可能的。 - stalk
1
一个注意事项:Centrifuge无法在客户端写入Websocket时通知Django项目。新的用户生成内容必须以标准方式发送到Django后端 - 即通过AJAX或普通POST请求 - 然后在您的Django应用程序中验证数据,可能像往常一样保存到数据库,然后您可以向Centrifuge发送消息,这条消息将广播给所有客户端。可能会创建不使用Django后端的Websocket应用程序 - 但这是一种罕见情况,因为通常我们需要处理新数据(检查权限,验证,保存)。 - Alex Emelin
1
@AlexEmelin 谢谢,已更新答案。我只是想,如果我们打开“is_watching”项目标志,那么我们可以通过REST API接收这些消息。但现在我看到,它只会显示在离心机Web界面中。 - stalk
1
Centrifuge 项目已不再维护。他们将其迁移到 Go 语言,并现在称其为 Centrifugo。 - xyres
显示剩余5条评论

0

Django本身并没有提供你所需要的功能。你需要使用第三方库。一个可以跨框架使用的库是Pusher


0

我认为你应该选择Firebase,它提供了出色的同步功能,而且你将在前端使用聊天功能,所以它与Django环境无关,因此你可以使用firbase回调异步更新后端。此外,AngularJS与firebase一起提供了非常棒的三向绑定功能。


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