Ich verwende App Engine-Module in meinem Python-Projekt. (https://developers.google.com/appengine/docs/python/modules/#Python_Background_threads)App Engine Python-Module und Channel-Service
Ich bin auch Kanäle in m-Projekt mit: https://developers.google.com/appengine/docs/python/channel/
Ich möchte die Verbunden/Unterbrochen Post-Nachrichten lenken ('/ _ah/Kanal/verknüpften /', ‚/ _ah/Kanal/getrennt/') zu meinem API-Modul. Im Moment kann ich nicht bekommen sie in jedem Modul (Standard oder api)
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
zeigenapplication: integrate
dispatch:
- url: "*/_ah/channel/*"
module: api
Hinweis: Nur um klar zu sein, das alles funktioniert im Dev-Modus lokal.
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)
So mein Client (geschrieben in JavaScript) Beiträge zu 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 Callback-Funktion wird mit einem gültigen Token erreicht. Ich erstelle das Socket erfolgreich und vervollständige diese Funktion wie erwartet. Auf meinem lokalen System wird dann die onOpened-Funktion aufgerufen und ich erhalte die Nachrichten vom Server. In der Produktion onOpened wird nie aufgerufen und ich bekomme nie irgendwelche Nachrichten. Das/_ah/channel/connected/wird auch nie aufgerufen.
Wird der Channel-Dienst nicht mit Modulen unterstützt? Irgendwelche Gedanken, was ich vermisse?
Danke, aber ich habe Angst, dass hier nicht das Problem ist. Ich habe den Code hier nicht gepostet, aber ich habe die Routen hinzugefügt. Es würde nicht im Dev-Modus funktionieren, wenn ich nicht hätte. –
Ich habe diesen Code hinzugefügt, um Ihnen zu zeigen, was ich meine. –