0

チャネル 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")
4

1 に答える 1

2

channel_presence を有効にすると、アプリケーションは次の URL パスへの POST を受け取ります。

POSTs to /_ah/channel/connected/ 
POSTs to /_ah/channel/disconnected/ 

これらは、クライアントがチャネルに接続され、メッセージを受信できるか、切断されたことを示します。

Tracking_Client_Connections_and_Disconnections

期限切れのトークンの処理:

デフォルトでは、トークンの生成時に create_channel() 関数に duration_minutes 引数を指定して明示的に有効期限を設定しない限り、トークンは 2 時間で期限切れになります。クライアントがトークン期間よりも長くチャネルに接続されたままになっている場合、ソケットの onerror() および onclose() コールバックが呼び出されます。この時点で、クライアントはアプリケーションに XHR リクエストを送信して、新しいトークンをリクエストし、新しいチャネルを開くことができます。

したがって、onerror関数では、元の接続と同じように、基本的にもう一度やり直します。

トークンとセキュリティ

開いている多くのページに更新を送信するには、接続しているユーザーのリストを繰り返し処理し、メッセージを個別に送信します。「全員に送信」機能はありません。

接続されていると思われるクライアントにメッセージを送信し、応答がない場合はそれらを削除する「ハートビート」を組み込むこともできます。これは、(どうやら) 切断されたメッセージが、ブラウザ ウィンドウが閉じられたときに送信されないことがあるためです (電源障害など)。

于 2013-01-07T13:06:58.890 に答える