Присутствие API канала не срабатывает

Я пытаюсь обрабатывать состояния отключения/подключения, используя Presence в Channel API.

Вот некоторые из моего кода.

app.yaml

handlers:
- url: /(.*\.(gif|png|jpg|ico|js|css))
  static_files: \1
  upload: (.*\.(gif|png|jpg|ico|js|css))

- url: .*
  script: main.py

inbound_services:
- channel_presence

main.py

class onConnect(webapp.RequestHandler):
  def post(self):
    for user in users:
      users = User.all().fetch(1000)
      client = client_id = self.request.get('from')
      channel.send_message(user.channel,' connected');

class onDisconnect(webapp.RequestHandler):
  def post(self):
    Mainpage()
    for user in users:
      users = User.all().fetch(1000)
      client = client_id = self.request.get('from')
      channel.send_message(user.channel, ' disconnected');

application = webapp.WSGIApplication(
                                     [('/', MainPage),
                                     ('/_ah/channel/connected/',onConnect),
                                     ('/_ah/channel/disconnected/',onDisconnect),
                                     ('/chat',handleChat)],
                                     debug=True)

Javascript

<script>
        openChannel = function(){
            var token = '{{ token }}';
            var channel = new goog.appengine.Channel(token);
            var handler = {
                  'onopen': onOpened,
                  'onmessage': onMessage,
                  'onerror': function() {},
                  'onclose': function() {}
                };
            var socket = channel.open(handler);
            socket.onopen = onOpened;
            socket.onmessage = onMessage;

            var chat = document.getElementById('chatinput');
                chat.onkeyup = function(e){
                    if(e.keyCode == 13){
                        sendChat(this.value);
                        this.value = '';
                    }
                }
        }

        sendMessage = function(path, opt_param) {
            if (opt_param) {
                path += '?' + opt_param;
            }
            var xhr = new XMLHttpRequest();
            xhr.open('POST', path, true);
            xhr.send();
        };

        onOpened = function(){
            console.log('Channel Opened');  
            var chatlog = document.getElementById('chatlog');
            var msg = document.createElement('div');
                msg.innerHTML = 'Channel Opened';
                chatlog.appendChild(msg);
            sendMessage('/chat','m='+'A User Joined.');
        }

        onMessage = function(m){
            console.log('Message Recieved');
            var chatlog = document.getElementById('chatlog');
            var msg = document.createElement('div');
            var d = new Date();
                msg.innerHTML = d.toLocaleTimeString() + ': ' + m.data;
                chatlog.appendChild(msg);
        }

        sendChat = function(msg){
            console.log(msg);
            sendMessage('/chat','m='+msg);
        }

        openChannel();
    </script>

Используя этот код, connnect и disconnect не срабатывают, когда пользователь закрывает свой браузер или что-то еще.

Что-то не так с этим кодом?


person AlexCheuk    schedule 14.04.2012    source источник
comment
Вы действительно создаете токен и инициализируете клиентскую сторону? Я не вижу кода этой части в вашем вопросе.   -  person alex    schedule 14.04.2012
comment
Что вы видите в своих журналах для /_ah/channel/connected и /_ah/channel/disconnected?   -  person Nick Johnson    schedule 18.04.2012
comment
вы на SDK 1.6.5? Вы замечаете проблему, когда они просто перезагружают страницу?   -  person Anentropic    schedule 21.05.2012
comment
Вы когда-нибудь решили это, у меня такая же проблема?   -  person themaestro    schedule 24.11.2013
comment
Я вижу, что это произошло некоторое время назад, но вы когда-нибудь находили проблему?   -  person davidkomer    schedule 02.02.2015
comment
Лично я (и я могу говорить об этом только лично!), я не был так уж доволен API канала в прошлом - хотя я уверен, что это не то, что вы хотели бы услышать, вы пробовали? о переходе на Firebase см. googlecloudplatform.blogspot.com. /2014/11/ , wired.com/2014 /11/why-google-acquired-firebase , firebase.com ...? Я могу ошибаться, но похоже, что это новая мода в этой области, и приобретение Google, похоже, предполагает хорошее будущее интеграции с Google Cloud Platform...!   -  person Alex Martelli    schedule 21.03.2015
comment
У меня такая же проблема. Неполный код от Google.   -  person Stubbies    schedule 17.05.2015


Ответы (1)


Да, список маршрутов неверен. Поместите ('/', MainPage) в конец списка маршрутов. Из руководства по маршрутизации URI webapp2:

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

person Alex Dvoretsky    schedule 27.08.2015