Google Channel API使用令牌发送消息

时间:2013-02-17 23:50:08

标签: google-app-engine token channel-api

在文档中,它说“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()而不是token,则此序列可以正常工作

4 个答案:

答案 0 :(得分:1)

回应btevfik的初步问题:在send_message中允许令牌或client_id是1.7.5(最近)发布的功能。有些人可能不熟悉它,因此他们建议使用client_id。两者都应该有用!

我在代码中唯一能看到的事实是你不应该依赖令牌变量在两个请求之间纠正。他们可能甚至没有登陆应用程序的同一个实例。如果您与更多详细信息共享您的代码,我可能会发现一些东西。正确的方法是将令牌存储在数据存储区中,或者在发送将触发消息的消息时将其作为参数从客户端传递。

此功能的目的是允许人们从后端(或其他版本)发送消息。以前是不可能的,而现在你可以直接使用令牌而不是client_id。

答案 1 :(得分: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(或者用于初始化令牌的内容。)

只是一个想法,如果它仍然相关。

答案 2 :(得分:0)

您不应将特定于请求的值存储在全局变量中。将它们存储在cookie中,或者将它们作为请求参数传递。

答案 3 :(得分:0)

我认为你这里确实没有问题。

您可以向已登录或未登录的用户发送消息。

我认为你遇到的问题是知道有多种方法可以使用频道API:令牌。

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

  

在此示例中,它显示JavaScript客户端显式请求令牌并将其客户端ID发送到服务器。相反,您可以选择设计应用程序,以便在页面加载到浏览器之前将令牌注入客户端,或者如果愿意,可以选择其他一些实现。

Option 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/