Google-App-Engine频道API:服务器不会向客户端发送消息

问题描述 投票:1回答:1

我创建了简单的代码来了解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控制台说,它已成功发送到/ open,但没有警报发出,就像它没有响应一样。 您有什么想法,问题出在哪里?

感谢音调

编辑:我向javascript中添加了onerror和onclose事件处理程序,并在优化页面后立即调用了onerror事件,说“ Invalid + token”,然后是onclose事件。

javascript python google-app-engine channel-api
1个回答
0
投票

我敢打赌,如果您记录了channel_key,则在创建频道和发送消息时会有所不同。 对于本练习,您可以只使用一个常数。 对于“真实”代码,您将需要使用数据存储区和内存缓存作为通道键。

© www.soinside.com 2019 - 2024. All rights reserved.