当前位置: 首页 > 面试题库 >

Django向用户推送HTTP响应

强阳曜
2023-03-14
问题内容

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

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

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

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

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


问题答案:

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。



 类似资料:
  • 长连接服务(TCP、WebSocket)支持向客户端推送数据,具体用法https://doc.imiphp.com/utils/Server.html

  • 长连接服务(TCP、WebSocket)支持向客户端推送数据,具体用法https://doc.imiphp.com/utils/Server.html

  • 如何使用Firebase向我的应用程序的所有注册用户发送推送通知?我在纪录片中搜索了api,但没有找到任何有用的东西。

  • 我正在尝试使用Netty编写RTSP服务器。 现在,客户端发送请求 我想发回以下回复 我应该使用什么来构造http响应。我应该使用HttpResponse还是只使用普通字节数组并将其转换为ByteBuf? 我使用的Netty版本是4.1.5 提前谢谢。

  • 我正在尝试使用python向所有用户发送推送通知。但是,我知道没有办法使用应用程序做到这一点,您必须使用主题(据我所知)。有没有办法可以从应用程序中创建主题?谢谢编辑:我对Firebase完全陌生(如果我很困难,很抱歉)

  • 我有聊天应用程序我正在使用Firebase firestore数据库,我正在保存最近的消息如下 接收者端:messages->recieverId->recent_messages 这意味着相同的消息将被写入当前用户和接收者用户文档。(同一消息将写入两个不同的文档) 消息内容如下: -接收方 现在我要观察集合,并且只向接收方用户发送通知,有什么方法可以避免向这两个用户发送推送通知吗?