我想使用通道api推送更新打开页面,到目前为止我所做的是将页面客户端ID存储在ndb中 - 我已经包含了代码摘要
我的问题是: 如何管理已关闭的页面和过期的令牌?
这是将更新推送到许多打开页面的最佳方式吗?
打开页面代码:
import webapp2
import uuid
from google.appengine.api import channel
from google.appengine.ext import ndb
class Frame(ndb.Model):
clientID = ndb.StringProperty()
date = ndb.DateTimeProperty(auto_now_add=True)
class MainHandler(BaseHandler):
def get(self):
client_id = str(uuid.uuid4())
channel_token = channel.create_channel(client_id)
frame = Frame(clientID = client_id)
frame.put()
self.render_response('home.html',** "token":channel_token,"client_id":client_id)
发送消息代码:
from google.appengine.api import channel
from google.appengine.ext import ndb
class Frame(ndb.Model):
clientID = ndb.StringProperty()
date = ndb.DateTimeProperty(auto_now_add=True)
frames = Frame.query().fetch(10)
for i in frames:
channel.send_message(i.clientID, "some message to update")
答案 0 :(得分:2)
启用channel_presence后,您的应用程序会收到以下URL路径的POST:
POSTs to /_ah/channel/connected/
POSTs to /_ah/channel/disconnected/
这些信号表示客户端已连接到该频道并可以接收消息或已进行dicsonnected。
Tracking_Client_Connections_and_Disconnections
处理过期的令牌:
默认情况下,令牌会在两小时后过期,除非您在生成令牌时通过向create_channel()函数提供duration_minutes参数来明确设置过期时间。如果客户端保持连接到通道的时间超过令牌持续时间,则会调用套接字的onerror()和onclose()回调。此时,客户端可以向应用程序发出XHR请求以请求新令牌并打开新频道。
因此,在您的onerror
函数中,您基本上就像原始连接一样重新执行此操作。
要向多个打开的页面发送更新,只需遍历已连接用户列表并单独向其发送消息。没有“传输到所有”功能。
您可能还希望构建一个“心跳”,将消息发送到所谓连接的客户端,如果没有回复则将其删除。这是因为当浏览器窗口关闭时,有时(显然)不会发送断开连接的消息(电源故障,无论如何)。