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() 而不是 token,则此序列可以正常工作

4

4 回答 4

1

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

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

此功能的目的是允许人们从后端(或其他版本)发送消息。以前是不可能的,而现在如果你直接使用令牌而不是 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 回答