一尘不染

Django向用户推送HTTP响应

django

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

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

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

我是Web编程的初学者,因此我不确定这是否适合需要“彗星或长轮询”之类的“实时Web应用程序”。我的应用程序类似于聊天应用程序,除了我不提交文本文件而是图像文件。因此,我认为彗星解决方案会起作用。我已经尝试使用Orbited and Twisted了很长时间,但是用Django来实现它并不幸运,可能是因为我不了解如何用彗星解决方案来完成我想要的事情。我希望经验丰富的程序员向我指出,要实现此目标到底需要什么,或者我是否正朝着正确的方向前进(使用彗星)。

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


阅读 541

收藏
2020-03-28

共1个答案

一尘不染

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

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

(1)进行轮询-每隔X倍的时间使用Ajax / javascript轮询服务器。X越小,它越“像”推送,但服务器不断响应这些请求的体验也越多。

(2)使用websockets。HTML5规范的一部分是所谓的websockets。Websockets允许浏览器打开与服务器的持久连接。一旦打开此连接,就可以像使用更传统的TCP套接字一样,在客户端之间向服务器之间以及服务器与客户端之间来回推送数据。websockets的问题(我上次听说)是,它们在浏览器之间仍然有些气质,当然在旧版浏览器中根本无法使用。

(3)将Flash与Javascript接口配合使用。Flash具有设置持久TCP连接的功能,可以像“普通” TCP连接一样用于推/拉数据。(也请参见此SO问题:Flex中的HTTP推送示例)

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

但是,既然你已经说过要使用Python / Django,那么你应该查看Django-Websockets-一个在Django中使用websockets的框架。但是请务必阅读作者在页面上发布的“ 免责声明”,使用该免责声明存在一些重大困难/局限性,主要是因为Django在设计时并未考虑到websocket。

我认为最好的选择是最终使用Websockets,并且当用户的浏览器不支持Websocket时,它会自动回退到Ajax Polling。

2020-03-28