Django 和长轮询

标签 django comet long-polling cometd

我需要在我的应用程序中实现长轮询来检索事件。但我不知道该怎么做。我知道长轮询的概念,即保持连接打开,直到事件发生。但是我如何在我的项目中实现这一点。如果您能给我一个简单的客户端长轮询示例以及我想的 View ,我将不胜感激。谢谢!

最佳答案

免责声明:这个答案早已过时。到 2020 年,这个问题有很多解决方案,django channels只是选择之一。

<< 免责声明

非常简单的例子:

import time

def long_polling_view(request):
    for i in range(30): #e.g. reopen connection every 30 seconds
        if something_happened():
            ...
            return http.HttpResponse(
                arbitrary_JSON_content,
                mimetype='application/javascript'
            )
        time.sleep(1)
    return http.HttpResponse({}, mimetype='application/javascript')

从客户端,您必须处理超时并重新打开连接。

但是,我应该说这通常是不好的方法,原因有很多:
  • 客户端和服务器的计算成本都很高
  • 它对环境很敏感,例如超时
  • 它仍然受到 1 秒的延迟(示例中的 time.sleep())

  • 在大多数情况下,每 3-5-10 秒检查一次 setTimeout() 中的响应就可以正常工作,并且在资源方面更有效。

    但是还有比这更好的第三种选择。实际上,当没有其他事情可以获取实时更新时,长轮询更像是一种历史性的事情。 Websockets 更快、更便宜,现在 available in Django .

    关于Django 和长轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22582417/

    相关文章:

    用于通知的 Django Redis

    python - Django REST Framework - 用于单元测试的假对象

    c# - ASP.NET - Comet 将消息从服​​务器推送到所有客户端

    javascript - 服务器推送 : comet vs ape?

    javascript - 长轮询导致超出最大调用堆栈大小

    angular - 如何让守卫订阅 Angular 2 中服务的长轮询请求

    php - Laravel 聊天中的长轮询 : Why is the div not updating itself?

    MySQL 服务器已消失(代码 2006)

    python - 使用 GAE 用户服务 - 无法获取 "sign-in as a different user"

    comet - 异步servlet长轮询和bayeux协议(protocol)( cometd )之间的区别