python - Presencia API de canal no activada
google-app-engine channel-api (1)
Estoy tratando de manejar los estados de desconexión / conexión usando Presencia en Channel API.
Aquí hay algunos de mis códigos.
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>
Al usar este código, connnect
y disconnect
no se activa cuando un usuario cierra su navegador o lo que sea.
¿Hay algo mal con este código?
Sí, la lista de rutas es incorrecta. Pon (''/'', MainPage)
al final de la lista de rutas. De la guía de enrutamiento URI de webapp2 :
Cuando la aplicación recibe una solicitud, intenta hacer coincidir cada una en orden hasta que coincida, y luego llamar al controlador correspondiente.