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

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

我想我可以在用户上传照片时使用Django信号产生回调,但是如何让Django向其他用户发布通知呢?该通知可以是alert 或者简单地将其他用户重定向到显示上传的图片的新HTML.我更喜欢后者.

我是网络编程的初学者,所以我不确定这是否适合需要一个‘实时网络应用’来实现诸如Comet或长轮询之类的东西.我的应用程序类似于聊天应用程序,不同之处在于我提交的不是文本文件,而是图像文件.正因为如此,我认为彗星的解决方案会奏效.我已经try 了很长一段时间来研究有轨道和扭曲,但在使用Django实现它方面没有运气,可能是因为我不知道如何用彗星解决方案来实现我想要的.我希望更有经验的程序员指出我到底需要什么才能实现这一点,或者我是否正在朝着正确的方向前进(使用Comet).

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

推荐答案

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

当你需要"推送"客户时,基本上有三种 Select .

(1) 执行轮询——使用Ajax/javascript每隔X个时间轮询服务器一次.X越小,它越"感觉"像推送,但服务器必须不断响应这些请求的开销也越大.

(2) 使用websockets.HTML5规范的一部分叫做websockets.WebSocket允许浏览器打开与服务器的持久连接.一旦这种连接被打开,数据就可以像传统的TCP套接字一样,在客户端到服务器、服务器到客户端之间来回推送.websockets(我上次听说)的问题是,它们在不同浏览器之间仍然有点易怒,当然在较旧的浏览器中不起作用.

(3) 使用Flash with a Javascript interface.Flash具有设置persistent TCP connections的功能,它可以像"正常"TCP连接一样用于推/拉数据.(同样参见这个问题:HTTP push examples in Flex)


如果你是从零开始这个项目,我建议你写你的后端在Node.jsSocket.io.插座io是一种"类似套接字"的框架,可以对其进行编程,然后Javascript客户端(在webbrowser中运行)智能地确定要使用的最佳"持久连接"——首先它try 使用WebSocket,然后是Flash,然后是各种类型的长轮询.


但是既然您已经说过要使用Python/Django,那么您应该查看Django-Websockets--一个在Django中使用WebSockets的框架.但是一定要阅读作者放在页面上的Disclaimer,使用它有一些重大的困难/限制,主要是因为Django在设计时没有考虑到WebSockets.

我认为,当用户的浏览器不支持Websockets时,最好的 Select 就是使用Websockets,智能地回退到Ajax轮询.

Django相关问答推荐

Django中的设计用户类

在保存新实例之前删除一个实例(Django模型保存方法)

如何显示日期?

RDBMS多对多关系Django

覆盖保存以创建范围的多个对象()

错误``Forbidden (403) CSRF 验证失败.请求中止.``` 当try 登录管理员时

如何连接到 docker 容器中的 postgres 数据库?

root urls.py 是 Django 中的 config/urls.py 吗?

如何在不编写每个视图中的逻辑的情况下呈现值,Django?

Django - 使用在 URL 中传递的父类主键从子类中过滤对象

未为部署的 django rest 框架加载静态文件

Django REST Framework 图片上传

如何访问 Django Rest Framework 上的自定义 HTTP 请求标头?

django 在 ubuntu 中安装在哪里

在 Django CharFields 中自动截断 max_length 字段

Django:在模型管理器中获取模型的表名?

如何创建一个在复选框右侧显示复选框标签的 Django 表单?

如何在 Django 和 django-jsonfield 中将 JSONField 的默认值设置为空列表?

在 Celery 任务中运行 Scrapy 蜘蛛

用于创建和更新的基于 Django 类的视图