Django和Long Polling

时间:2014-03-22 19:26:25

标签: django comet long-polling cometd

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

1 个答案:

答案 0 :(得分:2)

非常简单的例子:

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