频道API存在不触发
我试图在Channel API中使用Presence来处理断开/连接状态。
这里是我的一些代码。
的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>
使用这个代码,当用户closures他们的浏览器或者其他东西时, connnect
和disconnect
不会被触发。
这段代码有什么问题吗?
是的,路由列表是错误的。 将('/', MainPage)
放在路由列表的末尾。 从webapp2 URI路由指南 :
当应用程序接收到一个请求时,它会尝试按顺序匹配每个请求,直到匹配,然后调用相应的处理程序。
- Java示例如何使用OAuth在GAE上使用Facebook帐户login
- 如何删除Google Application Engine中未使用的索引?
- Google App Engine Java上的RESTful应用程序?
- 在GAE上parsing完全有效的XML时,“prolog中不允许使用内容”
- Google App Engine作为制作平台
- 春季 – POST后redirect(即使有validation错误)
- 如何上传和存储与谷歌应用程序引擎的图像(Java)
- 如何使用Google App Enginepipe理第三方Python库? (virtualenv?pip?)
- 如何unit testingGoogle Cloud Endpoints