【问题标题】:Detecting when a client disconnects with Django and Server-Sent Events on Heroku检测客户端何时与 Heroku 上的 Django 和服务器发送事件断开连接
【发布时间】:2013-03-25 09:12:45
【问题描述】:

Heroku 关于sending a streaming response 的文档说:

"如果您正在发送流式响应,例如使用 server-sent 事件,您需要检测客户端何时挂断,并制作 确保您的应用服务器立即关闭连接。 "

我一直在使用django-sse 在 Django 中使用服务器发送事件在 Heroku 上进行试验。它使用一个永远循环的迭代器,从 Redis 发布/订阅通道读取消息并将它们发送到客户端:

def iterator(self):
    connection = _connect()
    pubsub = connection.pubsub()
    pubsub.subscribe(self.get_redis_channel())

    for message in pubsub.listen():
        if message['type'] == 'message':
            event, data = json.loads(message['data'])
            self.sse.add_message(event, data)
            yield

问题是,如果客户端断开连接,我想跳出这个循环,这样我就可以关闭与 Redis 的连接。如何检测客户端何时断开连接?

【问题讨论】:

  • 您确定连接不会自动关闭吗?可以使用redis-cli中的CLIENT LIST命令来检查django redis客户端是否还在连接。
  • Heroku 上没有(虽然我在本地运行时有)。当我用完 Redis 连接时,我第一次注意到这个问题,尽管我是唯一一个使用我的测试站点的人(免费的 RedisToGo 计划最多有 10 个连接。)后来我通过redis-cliCLIENT LIST 确认确实连接没有自动关闭。

标签: python django heroku server-sent-events


【解决方案1】:

我在 Heroku 上的 Scala Play2 应用程序中遇到了类似的问题,它无法检测到客户端在 close() 或刷新或关闭窗口时何时关闭了 SSE 连接。启用新的 Heroku Labs websockets feature 为我解决了这个问题。

更新:

我向 Heroku 寻求支持并告诉他们我的经历。这是他们的回复。

嗨劳埃德,

这是一个已知问题,您认为新的 WebSocket 是正确的 端点解决了问题。我们不打算在 现有的端点,但我们最终会推出 WebSocket 更广泛的受众。

最好的,

杰克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多