【问题标题】:Django and Long PollingDjango 和长轮询
【发布时间】:2014-04-30 05:12:15
【问题描述】:

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

【问题讨论】:

  • 不清楚你要什么……至少对我来说不是
  • @JoranBeasley 嗨!我有一个用户上传视频的应用程序。因此,当有人上传视频时,我想通知其他用户已经上传了新视频,例如 twitter 或 facebook 甚至 SO。另外,如果有人观看他们的视频,我想通知用户。但我想我可以做到这一点,如果我知道如何实现长轮询并通知用户上传的新视频。所以,我需要知道的就是实现长轮询以通知用户新对象保存在数据库中。希望我很清楚。请问我是不是。谢谢。

标签: django comet long-polling cometd


【解决方案1】:

免责声明:这个答案早已过时。到 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。

【讨论】:

  • 您的 websocket 解决方案链接已损坏。我使用 ajax 从客户端实现了与 Django 类似的东西。但仍然存在超时问题。 gevent pixeldonor.com/2014/jan/10/django-gevent-and-socketio 是一个可能的(好的)解决方案吗?
  • 我已经修复了链接。 gevent 是一个好的解决方案吗?这取决于。您应该对 greenlets 的工作原理有一个很好的了解,否则您可能会遇到非常奇怪的问题:stackoverflow.com/questions/17514633/…
  • 您的链接指向一个项目,其中最后一次提交可以追溯到 7 个月。看起来不太活跃。
猜你喜欢
  • 2013-01-02
  • 2011-10-05
  • 2012-04-08
  • 1970-01-01
  • 2021-10-13
  • 2013-08-08
  • 2012-04-26
  • 2013-11-01
  • 1970-01-01
相关资源
最近更新 更多