URL для канала API, кажется, пуст (канал GAE) работает на Dev, а не на Google

У меня есть простое полное приложение, которое использует API канала GAE. Он работает на моем локальном компьютере, но когда я загружаю его в appspot, URL-адрес, где должен находиться api канала, кажется пустым, и приложение завершается с сообщением "goog is not found".

Сервер:

import webapp2
import jinja2
import os
import time
import logging

channel_key = 'key'

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

class OpenedHandler(webapp2.RequestHandler):
    def post(self):
        channel.send_message("1", "hi") 
    logging.info("send hi");

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

Клиент:

<!DOCTYPE html>
<html>
<body>
<div id="debug">_</div>

<!--
<script src="https://talkgadget.google.com/talkgadget/channel.js"></script>
<script type="text/javascript" src="/static/channel.js"></script>
-->     

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

function debug(s) {
    document.getElementById("debug").innerHTML = s;
}   
my_func = function() {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/opened');
    xhr.send();
}           
onOpened = function() {
    debug("open");
    setTimeout(my_func, 2000);
};      

onMessage = function(message) {
    alert("something recieved");
    alert(message);
}       

channel = new goog.appengine.Channel("{{token}}")  // this is where it fails
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>

На моем локальном компьютере вызывается функция onOpened и отправляется сообщение. При установке на appspot я получаю

"Uncaught ReferenceError: goog is not defined" 

сразу после

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

Когда я смотрю на вкладке "Ресурсы" окна инструментов разработчика и нажимаю "jsapi", она кажется пустой:

http://www.sonic.net/~crb/foo.png

Я пробовал другие URL, вы можете увидеть эти комментарии в html, но ничего не работает. Я почти уверен, что это правильно, я не могу объяснить, почему API кажется пустым и, следовательно, "goog" не определено.

Спасибо за любые предложения.

2 ответа

У меня была такая же проблема. Посмотрите, добавили ли вы следующий код непосредственно перед </body> индуктор.

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

Это исправило мою ошибку "goog is not found".

Для меня это оказалось вызвано подключаемым модулем Disconnect для Chrome, который блокировал URL-адрес, на который перенаправляется /_ah/channel/jsapi. Единственным решением было отключить Disconnect для этой страницы.

Я постараюсь сообщить разработчику Disconnect, что этот URL не должен быть заблокирован, поскольку он, вероятно, предоставит жизненно важные функции для любой страницы, которая его загружает.

Другие вопросы по тегам