琐碎的GAE应用程序中的频道没有得到'onmessage'

时间:2013-07-09 01:07:15

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

我正在尝试创建最小的GAE应用程序以显示使用频道api。 我在python中有两个处理程序,第一个“TestPage”发出下面显示的html。第二个“SendPage”尝试通过该通道向测试页面发送消息。 TestPage的代码是

class TestPage(Handler):
    def get(self):
        token = channel.create_channel("1")
        self.render("test.html", token = token)

它只是创建id为“1”的频道,并使用从create_channel()传回的令牌重新显示该页面。

SendPage只是:

class SendPage(Handler):
    def get(self):
        channel.send_message("1", "hello")
        self.write("sent hello to 1")

html和我一样小:

<!DOCTYPE HTML>
<html>
<body>
<br>Token is {{ token }}
<br>
<div id="debug">_</div>

<!--
<script src="https://talkgadget.google.com/talkgadget/channel.js"></script>
-->
<script src="static/channel.js"></script>
<script defer="defer">
    function debug(s) {
        document.getElementById("debug").innerHTML = s;
    }

    var channel = new goog.appengine.Channel( {{ token }} );
    var socket = channel.open();
    socket.onopen = function(e) {
        debug("open");
    }
    socket.onclose = function(e) {
        debug("close");
    }
    socket.onerror = function(e) {
        debug("error");
    }
    socket.onmessage = function(e) {
        debug("message");
    }
    debug("ready");

</script>
</body>
</html>

所以,在chrome中我拉起TestPage,我看到“准备好”的消息。然后我在另一个选项卡中拉出SendPage。并看到“发送消息”。然后,当我回到TestPage时,我希望将“ready”替换为“message”。但这从未发生过。没有调用任何套接字处理函数。

我暂时陷入困境,并希望得到任何帮助或建议。

谢谢。

1 个答案:

答案 0 :(得分:0)

好的,我明白了。有两个问题。首先,模板行

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

应该是

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

因为它是令牌,就像“channel-2052893164-1373347311-1”,它悄悄地评估了一个数字。

其次,channel.js的正确脚本是

<script type="text/javascript" src="/_ah/channel/jsapi"></script>

我引用的其他脚本来自其他堆栈溢出答案,我猜他们没有正确应用于此问题。

感谢。