1

ドキュメントでは、「client_id」の部分が実際にトークンになる可能性があると記載されていますが、機能しません。誰もが理由を知っていますか?

https://developers.google.com/appengine/docs/python/channel/functions

client_idパラメーターが実際にcreate_channel呼び出しによって返されるトークンである場合、send_messageはアプリのさまざまなバージョンで使用できます。たとえば、フロントエンドでチャネルを作成してから、アプリのバックエンドからメッセージを送信できます。

これを使用したい理由は、匿名ユーザーにもログインせずにメッセージを送信したいからです。トークンが機能しない場合に「client_id」を割り当てることが可能かどうかはわかりません。

これが私がトークンを作成する方法です

    user = users.get_current_user()

    if user:
        token = channel.create_channel(user.user_id())
    else:
        token = channel.create_channel(str(uuid.uuid4()))

その後、クライアントに注入します

template_values = {
        'token' : token,
    }

クライアント側でチャネルを開きます

      openChannel = function() {
    var token = '{{ token }}';
    var channel = new goog.appengine.Channel(token);
    var handler = {
      'onopen': onOpened,
      'onmessage': onMessage,
      'onerror': function() {},
      'onclose': function() {}
    };
    var socket = channel.open(handler);
    socket.onopen = onOpened;
    socket.onmessage = onMessage;
  }

今メッセージを送信します

var xhr = new XMLHttpRequest();
xhr.open('POST', path, true);
xhr.send();

サーバーでは、メッセージが受信されたら、トークンを使用してメッセージを送り返します

channel.send_message(token, someMessage)

クライアントに戻る

onMessage = function(m) {
alert("you have some message");     
}

send_messageを呼び出すときに、トークンの代わりにclient_id()が使用される場合、このシーケンスは正常に機能します

4

4 に答える 4

1

btevfikの最初の質問への回答:send_messageでトークンまたはclient_idを許可することは、1.7.5(ごく最近)でリリースされた機能です。一部の人々はまだそれをよく知らないかもしれないので、彼らはclient_idを使用することを提案します。両方とも機能するはずです!

私があなたのコードで見ることができる唯一のことは、2つのリクエストの間でトークン変数が正しいことに依存してはならないという事実です。アプリの同じインスタンスに到達することすらできない場合があります。あなたがあなたのコードをより詳細に共有するならば、私は何かを見つけることができるかもしれません。適切な方法は、トークンをデータストアに保存するか、メッセージをトリガーするメッセージを送信するときにクライアントからパラメーターとしてトークンを渡すことです。

この機能の目的は、ユーザーがバックエンド(または他のバージョン)からメッセージを送信できるようにすることでした。以前は不可能でしたが、client_idの代わりにトークンを直接使用すれば、今は可能です。

于 2013-02-23T07:03:04.883 に答える
1

この投稿は長い間行われてきましたが、トークングローバル変数の使用法に興味がありますか?

このコードが表示されません:

global token

トークンを設定する前に

user = users.get_current_user()

if user:
    token = channel.create_channel(user.user_id())
else:
    token = channel.create_channel(str(uuid.uuid4()))

そのコードが欠落している場合は、tokenグローバルではなく、上記の関数のローカルスコープに設定されます。したがって、後で使用されるトークン値はNone(またはトークンが初期化されたものに)なります。

それでも関連がある場合は、考えてみてください。

于 2013-10-12T14:19:38.087 に答える
0

リクエスト固有の値をグローバル変数に格納しないでください。それらをCookieに保存するか、代わりにリクエストパラメータとして渡します。

于 2013-02-18T06:48:21.047 に答える
0

ここでは実際に問題はないと思います。

ログインしているかどうかに関係なく、ユーザーにメッセージを送信できます。

あなたが抱えている問題は、チャネルAPI re:tokensを使用する方法が複数あることを知っていることだと思います。

https://developers.google.com/appengine/docs/python/channel/overview#Life_of_a_Typical_Channel_Message

この例では、JavaScriptクライアントが明示的にトークンを要求し、そのクライアントIDをサーバーに送信することを示しています。対照的に、ページがブラウザに読み込まれる前にトークンをクライアントに挿入するようにアプリケーションを設計するか、必要に応じて他の実装を選択することができます。

オプション1

この図は、サーバー上でのチャネルの作成を示しています。この例では、JavaScriptクライアントが明示的にトークンを要求し、そのクライアントIDをサーバーに送信することを示しています。対照的に、ページがブラウザに読み込まれる前にトークンをクライアントに挿入するようにアプリケーションを設計するか、必要に応じて他の実装を選択することができます。

これが私のデモの実装です、それが何らかの形で役立つことを願っています:https ://github.com/Paul1234321/channelapidemo.git

GAEでチャンネルを作成するためのコードは次のとおりです。

  client_id = str(uuid.uuid4()).replace("-",'')
  channel_token = channel.create_channel(client_id)

そしてJSでは:

channel = new goog.appengine.Channel('{{ token }}');

実際の動作をご覧ください:http://pppredictor.appspot.com/

于 2013-02-18T10:35:00.453 に答える