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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage