google app engine - ऐप इंजन पायथन मॉड्यूल और चैनल सर्विस




google-app-engine python-2.7 (2)

आपको यूआरएल कनेक्ट और डिस्कनेक्ट करने के लिए एक हैदर राउटिंग घोषित करना होगा।

main.py में हैंडलर रूटिंग:

application = webapp2.WSGIApplication([
    ...
    # Define a URL routing for /_ah/channel/connected/
    webapp2.Route(r'/_ah/channel/connected/',
                  handler=ChannelConnectedHandler,
                  name='channel_connected')

], debug=True, config=webapp2_config)


# Implement class handler of /_ah/channel/connected/
class ChannelConnectedHandler(webapp2.RequestHandler):
    def post(self):
        client_id = self.request.get('from')
        logging.info('client %s has connected!' % client_id)
        ...

मैं अपने अजगर परियोजना में ऐप इंजन मॉड्यूल का उपयोग कर रहा हूं। ( https://developers.google.com/appengine/docs/python/modules/#Python_Background_threads )

मैं मीटर प्रोजेक्ट में चैनल का उपयोग कर रहा हूं: https://developers.google.com/appengine/docs/python/channel/

मैं अपने एपीआई मॉड्यूल से कनेक्ट / डिस्कनेक्ट किए गए पोस्ट मेसेज ('/ _ah / channel / connected /', '/ _ah / channel / disconnected /') को निर्देशित करना चाहता हूं। अभी मैं उन्हें किसी भी मॉड्यूल (डिफ़ॉल्ट या एपीआई) में दिखाने के लिए नहीं मिल सकता है

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

नोट: स्थानीय रूप से केवल देव मोड में यह सब काम साफ़ करने के लिए।

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)

तो मेरे क्लाइंट (जावास्क्रिप्ट में लिखा हुआ है) मेरे एपीआई मॉड्यूल में पोस्ट करता है और एक चैनल खोलता है।

    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);
    };

यह कॉलबैक फ़ंक्शन एक मान्य टोकन के साथ पहुंचा है। मैं सॉकेट को सफलतापूर्वक बना और इस फ़ंक्शन को अपेक्षित रूप से पूरा कर लिया। मेरे स्थानीय सिस्टम पर ओपन किए गए फ़ंक्शन को तब कहा जाता है और मुझे सर्वर से संदेश प्राप्त होता है। उत्पादन में ओपन किए गए कभी नहीं कहा जाता है और मुझे कभी भी कोई संदेश प्राप्त नहीं होता है / _ah / चैनल / जुड़े / भी कभी भी नहीं कहा जाता है

क्या चैनल सेवा मॉड्यूल के साथ समर्थित नहीं है? मैं क्या याद कर रहा हूँ के रूप में किसी भी विचार?


Google एंटरप्राइज़ समर्थन (उनके कच्चे जवाब से थोड़ा संशोधित) के अनुसार:

  1. channel_presence इनबाउंड सेवा को सक्षम होना चाहिए

    inbound_services:
    - channel_presence

    मॉड्यूल की yaml फाइल में इस इनबाउंड सेवा को सक्षम करना (उदाहरण के लिए, इस प्रश्न में api.yaml ) इस सेवा को सक्षम नहीं करेगा।

  2. */_ah शुरू होने वाले यूआरएल पथ प्रेषणीय मार्ग नहीं हैं और dispatch.yaml द्वारा पीछा नहीं किया जा सकता। Yaml इसलिए, channel_presence यूआरएल पथ हैंडलरों को app.yaml में वर्णित किया जाना चाहिए।

    handlers:
    - url: /_ah/channel/connected/
      script: mymodule.application




gae-module