канал в тривиальном приложении GAE не получает «onmessage»

Я пытаюсь создать минимально возможное приложение GAE, чтобы показать использование API канала. У меня есть два обработчика в питоне, первый «TestPage» отправляет html, показанный ниже. Второй «SendPage» пытается отправить сообщение по каналу на тестовую страницу. Код для TestPage

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

Он просто создает канал с идентификатором «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>

Итак, внутри хрома я открываю TestPage и вижу сообщение «готово». Затем я открываю SendPage на другой вкладке. И увидеть "отправленное сообщение". Затем, когда я вернусь к TestPage, я ожидаю, что «готово» будет заменено «сообщением». Но этого никогда не происходит. Ни одна из функций обработчика сокета не вызывается.

Я застрял на данный момент и был бы признателен за любую помощь или предложения.

Спасибо.


person Charlie Burns    schedule 09.07.2013    source источник
comment
Кстати, я запускаю это на своем локальном хосте с помощью dev_appserver.py. Исходный код API канала находится на моем локальном компьютере и был скопирован с talkgadget.google.com. /talkgadget/channel.js . Пожалуйста, спросите, есть ли у вас какие-либо вопросы. Спасибо.   -  person Charlie Burns    schedule 09.07.2013


Ответы (1)


Хорошо, я понял это. Было две проблемы. Во-первых, строка шаблона

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

должны были быть

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

поскольку токен был чем-то вроде «канал-2052893164-1373347311-1», который незаметно оценивался как число.

Во-вторых, правильный скрипт для channel.js был

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

Другие сценарии, на которые я ссылался, были из других ответов на переполнение стека, и я думаю, что они не применялись должным образом к этой проблеме.

Спасибо.

person Charlie Burns    schedule 09.07.2013