Django向用户推送HTTP响应

时间:2011-03-29 22:35:11

标签: django twisted push orbited

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

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

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

我是网络编程的初学者,所以我不确定这是否适合需要实现彗星或长轮询等实时内容的“实时网络应用程序”。我的应用程序类似于聊天应用程序,除了我不提交文本文件而是提交图像文件。因此,我认为彗星解决方案可行。我已经尝试过很长一段时间看Orbited和Twisted但是没有运气用Django实现它,可能是因为我不明白如何用彗星解决方案完成我想要的东西。我希望更有经验的程序员能够指出我为了实现这一点我需要什么,或者我是否朝着正确的方向前进(使用彗星)。

如果有人能给我一些关于如何继续的提示和提示,以及教程链接或指南,我将非常感激。

2 个答案:

答案 0 :(得分:57)

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

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

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

(2)使用websockets。 HTML5规范的一部分叫做websockets。 Websockets允许浏览器打开与服务器的持久连接。一旦打开了这个连接,就可以像使用更传统的TCP套接字一样,从客户端到服务器和服务器来回推送数据到客户端。 websockets的问题(我听到的最后一点)是它们在浏览器之间仍然有点不稳定,当然在旧浏览器中

(3)使用Flash with a Javascript interface。 Flash具有设置persistent TCP connections的功能,可用于推送/拉取数据,就像使用“普通”TCP连接一样。 (也见这个问题:HTTP push examples in Flex


如果您从头开始创建此项目,我建议您使用Node.jsSocket.io中编写后端。 Socket.io是“套接字”框架,你可以编程,然后Javascript客户端(在你的webbrowser中运行)智能地确定要使用的最佳“持久连接” - 首先它尝试使用Websockets,然后是Flash,然后各种类型的长期民意调查。


但是既然你已经说过想要使用Python / Django那么你应该看看Django-Websockets - 一个使用带有Django的websockets的框架。但请务必阅读作者在页面上提到的 免责声明 ,使用它时存在一些重大的困难/限制,主要是因为Django没有使用websockets设计心。

我认为,当用户的浏览器不支持时,最好使用Websockets并对Ajax Polling进行智能回退。

答案 1 :(得分:7)

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