API канала Google-App-Engine: сервер не отправляет сообщение клиенту

Я создал простой код, чтобы понять, как работает Google App Engine Channel API. Однако на самом деле мой код не работает, и я не знаю, почему. Я не очень разбираюсь в Python, поэтому извините меня, если это будет какая-то глупая ошибка.

Сервер:

from google.appengine.api import channel

import webapp2
import jinja2
import os
import time

channel_key = 'key'

class MainHandler(webapp2.RequestHandler):
    def get(self):
token = channel.create_channel(channel_key)
        template_values = {'token': channel_key}
        template = env.get_template('index.html')
        self.response.write(template.render(template_values))

class OpenedHandler(webapp2.RequestHandler):
    def post(self):
        channel.send_message(channel_key, "hi")     

env = jinja2.Environment(loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))     
app = webapp2.WSGIApplication([
    ('/', MainHandler),
    ('/opened', OpenedHandler)
], debug=True)

Клиент:

<!DOCTYPE html>

<html>
    <head>
    </head>
    <body>
        <script>
            var token = "{{ token }}";
            onOpened = function() {
                var xhr = new XMLHttpRequest();
                xhr.open('POST', '/opened');
                xhr.send();
            };

            onMessage = function(message) {
                alert("something recieved");
                alert(message);
            }
        </script>
        <script type="text/javascript" src="/_ah/channel/jsapi"></script>
        <script>
            channel = new goog.appengine.Channel(token);
            socket = channel.open();
            socket.onopen = onOpened;
            socket.onmessage = onMessage;
            socket.onerror = function(e){
                alert("error:"+e['description']);
            };
            socket.onclose = function(){
                alert("close");
            };

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

Консоль Javascript говорит, что он был успешно отправлен в /opened, но затем не приходит оповещение, как будто он не ответил. У вас есть идеи, где проблема?

Спасибо Тонекс

EDIT: я добавил обработчики событий onerror и onclose в javascript, и сразу после открытия страницы он вызывает событие onerror, говорящее «Неверный + токен», а затем событие onclose.


person Toneks    schedule 08.06.2013    source источник
comment
Я даже не создаю канал. Не могли бы вы ответить на этот stackoverflow.com/questions/34332222/   -  person Sunil Garg    schedule 17.12.2015


Ответы (1)


Бьюсь об заклад, если вы зарегистрируете свой channel_key, он будет отличаться при создании канала и при отправке сообщения. Для этого упражнения вы можете просто использовать константу; для «реального» кода вы захотите использовать хранилище данных и кэш памяти для ключей канала.

person Moishe Lettvin    schedule 08.06.2013
comment
Я пробовал это с константой, и результат был таким же. (Я думал, что он может создать больше каналов с одним и тем же токеном). Затем я также попытался отправить токен с клиента обратно на сервер, чтобы он был таким же, но тоже ничего не произошло. - person Toneks; 08.06.2013