36

我目前有一个用 Django 编写的非常简单的 Web 应用程序,我想在我的应用程序中实现回调/推送通知服务之类的东西。

例如:当一个用户(客户端)将照片上传到服务器时,服务器会通知所有其他连接的用户该照片。

我想我可以使用 Django 信号在用户上传照片时产生回调,但是如何让 Django 向其他用户发布通知?此通知可以是警报,也可以只是将其他用户重定向到显示上传图片的新 html。我更喜欢后者。

我是网络编程的初学者,所以我不确定这是否符合要求,因为需要一个实现诸如彗星或长轮询之类的“实时网络应用程序”。我的应用程序类似于聊天应用程序,只是我提交的不是文本文件而是图像文件。因此,我认为彗星解决方案会起作用。我已经尝试查看 Orbited 和 Twisted 很长一段时间了,但在用 Django 实现它时没有运气,可能是因为我不明白如何用彗星解决方案完成我想要的。我希望更有经验的程序员指出我究竟需要什么才能完成这个任务,或者我是否正朝着正确的方向前进(使用彗星)。

如果有人能给我一些关于如何进行的提示和提示,以及教程链接或指南,我将不胜感激。

4

2 回答 2

58

HTTP 本质上是一个“拉”协议——即,客户端从服务器拉数据,等待一段时间,然后再拉更多数据。实际上没有严格的 HTTP 方式将数据从服务器“推送”到客户端。

当您需要“推送”给客户时,您基本上有三个选择。

(1) 轮询——使用 Ajax/javascript 每 X 次轮询服务器。X 越小,“感觉”就越像推送,但服务器必须不断响应这些请求的开销也越大。

(2) 使用网络套接字。HTML5 规范的一部分是称为 websockets 的东西。Websockets 允许浏览器打开到服务器的持久连接。一旦这个连接被打开,数据就可以从客户端到服务器和服务器到客户端来回推送,就像使用更传统的 TCP 套接字一样。websockets 的问题(我最后一次听说)是它们在浏览器之间仍然有点喜怒无常,当然在旧浏览器中根本不起作用。

(3) 使用带有 Javascript 界面的 Flash。Flash 具有建立持久 TCP 连接的能力,可用于推送/拉取数据,就像使用“普通”TCP 连接一样。(也请参阅这个 SO 问题:Flex 中的 HTTP 推送示例


如果您从头开始这个项目,我建议您使用Socket.io在Node.js中编写后端。Socket.io 是“类套接字”框架,您可以对其进行编程,然后 Javascript 客户端(在您的网络浏览器中运行)智能地确定要使用的最佳“持久连接”——首先它尝试使用 Websockets,然后是 Flash,然后各种类型的长轮询。


但是既然你说你想使用 Python/Django,那么你应该查看Django-Websockets——一个在 Django 中使用 websockets 的框架。但是请务必阅读作者在页面上放置的免责声明,使用它存在一些重大困难/限制,主要是因为 Django 在设计时并未考虑到 websockets。

我认为当用户的浏览器不支持它时,你最好的选择最终是使用带有智能回退到 Ajax 轮询的 Websockets。

于 2011-03-30T04:43:17.410 回答
7

如果你曾经使用过 nginx,这是一个不错的选择 :),你可以使用推送模块http://pushmodule.slact.net/,我发现它很容易使用。您有一个 URL 用于在通道上发布消息(这可以在 python 中轻松完成,例如使用 httplib),以及一个用于从通道中提取消息的 URL(并且一个通道可能被多个用户使用)。有关 jquery 集成,另请参阅http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/

于 2011-03-30T07:20:26.773 回答