App Engine Python-Module und Channel-Service
Ich verwende App Engine-Module in meinem Python-Projekt. (https://developers.google.com/appengine/docs/python/modules/#Python_Background_threads)
Ich benutze auch Kanäle in m project:https://developers.google.com/appengine/docs/python/channel/
Ich möchte die verbundenen / getrennten Nachrichten ('/ _ah / channel / connected /', '/ _ah / channel / disconnected /') an mein API-Modul weiterleiten. Im Moment kann ich sie nicht dazu bringen, in einem Modul (Standard oder API) angezeigt zu werden.
app.yaml
api_version: 1
application: integrate
version: 1-0-0
runtime: python27
threadsafe: true
builtins:
- deferred: on
libraries:
- name: pycrypto
version: "2.6"
handlers:
- url: /favicon\.ico
static_files: static/favicon.ico
upload: static/favicon\.ico
- url: /admin/.+
script: src.default.main.app
login: admin
- url: /.*
script: src.default.main.app
api.yaml
api_version: 1
application: integrate
module: api
version: 1-0-0
runtime: python27
threadsafe: true
inbound_services:
- channel_presence
builtins:
- deferred: on
libraries:
- name: pycrypto
version: "2.6"
handlers:
- url: /admin/.+
script: src.api.main.app
login: admin
- url: /.*
script: src.api.main.app
dispatch.yaml
application: integrate
dispatch:
- url: "*/_ah/channel/*"
module: api
Hinweis: Um es klar zu machen, funktioniert alles lokal im Dev-Modus.
api.main.app
app = webapp2.WSGIApplication(debug=True)
_routes = [
:
ChannelDisconnectedHandler.mapping(),
ChannelConnectHandler.mapping()
]
for r in self._routes:
app.router.add(r)
ChannelDisconnectHandler
CHANNEL_DISCONNECTED_URL_PATTERN = '/_ah/channel/disconnected/'
class ChannelDisconnectedHandler(RequestHandler):
@classmethod
def mapping(cls):
return CHANNEL_DISCONNECTED_URL_PATTERN, cls
def post(self):
"""
Channel Presence handler. Will be called when a client disconnects.
"""
channel_id = self.request.get('from')
logging.info("Channel Disconnect. Id: %s" % channel_id)
ChannelConnectHandler
CHANNEL_CONNECT_URL_PATTERN = '/_ah/channel/connected/'
class ChannelConnectHandler(RequestHandler):
@classmethod
def mapping(cls):
return CHANNEL_CONNECT_URL_PATTERN, cls
def post(self):
"""
Channel Presence handler. Will be called when a client connects.
"""
channel_id = self.request.get('from')
logging.info("Channel Connect. Id: %s" % channel_id)
Mein Client (in Javascript geschrieben) postet also in meinem API-Modul und öffnet einen Kanal.
var open_channel = function(tokenResponse) {
console.log("Open Channel. token Response: " + tokenResponse)
token = tokenResponse.token;
var channel = new goog.appengine.Channel(token);
if (socket != null) {
socket.close();
}
socket = channel.open();
socket.onopen = onOpened;
socket.onmessage = onMessage;
socket.onerror = onError;
socket.onclose = onClose;
};
onOpened = function() {
console.info("Channel API Connection is open.");
};
onError = function(e) {
console.info("CHANNEL Error. Code: " + e.code + ", Description: " + e.description);
};
onClose = function() {
console.info("Close Channel");
};
onMessage = function(msg) {
console.info("Message Received: " + msg + ", Data: " + msg.data);
};
Diese Rückruffunktion wird mit einem gültigen Token erreicht. Ich erstelle den Socket erfolgreich und beende diese Funktion wie erwartet. Auf meinem lokalen System wird dann die Funktion onOpened aufgerufen und ich erhalte die Nachrichten vom Server. In der Produktion wird onOpened nie aufgerufen und ich erhalte keine Nachrichten. Das / _ah / channel / connected / wird auch nie aufgerufen.
Wird der Channel-Dienst bei Modulen nicht unterstützt? Irgendwelche Gedanken darüber, was mir fehlt?