Django将HTTP响应推送给用户

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

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

我想我可以使用Django的信号产生一个callback,当用户上传一张照片,但我怎么让Django发布通知给其他用户? 这个通知可以是提醒,或者简单地将其他用户redirect到显示上传图片的新html。 我宁愿后者。

我是networking编程的初学者,所以我不确定这是否符合这个法案,因为需要一个实时的web应用程序来实现像comet或long-polling这样的事情。 我的应用程序类似于聊天应用程序,除了我不提交文本文件,但图像文件。 正因为如此,我认为彗星解决scheme将起作用。 我已经尝试了很长一段时间看轨道和扭曲,但没有与Django实现它的运气,可能是因为我不明白如何完成我想要的彗星解决scheme。 我希望更有经验的程序员指出,为了完成这个任务,或者我要走向正确的方向(彗星),我究竟需要什么。

我真的很感激,如果有人可以给我一些技巧和提示,如何继续,以及教程链接或指南。

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

当你需要“推”到客户端时,基本上有三种select。

(1)轮询 – 使用Ajax / javascript每X轮询一次服务器。 X越小,感觉就越“推”,而且服务器需要不断响应这些请求的开销越大。

(2)使用websockets 。 HTML5规范的一部分是websockets。 Websockets允许浏览器打开到服务器的持续连接。 一旦这个连接被打开,数据可以从客户端到服务器和服务器到客户端来回移动,就像使用更传统的TCP套接字一样。 websockets的麻烦(最后我听到)是,他们仍然可以在浏览器之间有点脾气,当然不会在旧的浏览器工作。

(3)使用带有Javascript界面​​的Flash 。 Flash有能力设置持久的TCP连接 ,可以像使用“正常的”TCP连接一样使用推送/拉取数据。 (看到这个问题以及在Flex中的HTTP推送示例 )


如果你从头开始这个项目,我build议你用Socket.io在Node.js中编写你的后端。 Socket.io是可以编程的“类似于套接字的”框架,然后Javascript客户端(运行在您的浏览器中)智能地确定最佳的“持久连接”,首先尝试使用Websocket,然后使用Flash,然后长期投票的各种types。


但既然你说过你想使用Python / Django,那么你应该检查出Django-Websockets -一个使用Django的websockets的框架。 但是,一定要阅读作者放在页面上的免责声明 ,使用它有一些重大的困难/限制,主要是因为Django没有考虑到websocket的devise。

我认为,当用户的浏览器不支持它时,最好的办法就是使用Websockets,并将智能回退到Ajax轮询。

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