python频道API到期和谷歌应用引擎中的使用

时间:2013-01-07 11:41:30

标签: python google-app-engine app-engine-ndb channel-api

我想使用通道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")

1 个答案:

答案 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函数中,您基本上就像原始连接一样重新执行此操作。

Tokens and security

要向多个打开的页面发送更新,只需遍历已连接用户列表并单独向其发送消息。没有“传输到所有”功能。

您可能还希望构建一个“心跳”,将消息发送到所谓连接的客户端,如果没有回复则将其删除。这是因为当浏览器窗口关闭时,有时(显然)不会发送断开连接的消息(电源故障,无论如何)。