在Heroku上使用Django和服务器发送事件检测客户端断开连接
Heroku的文档关于发送流式响应提到:
“如果你正在发送流式响应,比如服务器发送事件,你需要检测客户端是否断开连接,并确保你的应用服务器及时关闭连接。”
我在Heroku上用Django实验服务器发送事件,使用了django-sse这个库。它使用一个无限循环的迭代器,从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的连接。请问我该如何检测客户端是否断开连接呢?
1 个回答
2
我在Heroku上用Scala Play2做应用时遇到过类似的问题,应用无法检测到客户端关闭SSE连接的情况,比如在调用close()、刷新页面或关闭窗口时。启用新的Heroku Labs的WebSocket功能解决了我的问题。
更新一下:
我联系了Heroku的客服,告诉他们我的经历。他们的回复是这样的:
嗨,Lloyd,
这是一个已知的问题,你说得对,新的WebSocket端点解决了这个问题。我们不打算在现有的端点上解决这个问题,但我们会逐步将WebSocket端点推广给更多用户。
祝好,
Jake