google app engine - ऐप इंजन पायथन मॉड्यूल और चैनल सर्विस
google-app-engine python-2.7 (2)
मैं अपने अजगर परियोजना में ऐप इंजन मॉड्यूल का उपयोग कर रहा हूं। ( 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 / चैनल / जुड़े / भी कभी भी नहीं कहा जाता है
क्या चैनल सेवा मॉड्यूल के साथ समर्थित नहीं है? मैं क्या याद कर रहा हूँ के रूप में किसी भी विचार?
आपको यूआरएल कनेक्ट और डिस्कनेक्ट करने के लिए एक हैदर राउटिंग घोषित करना होगा।
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)
...
Google एंटरप्राइज़ समर्थन (उनके कच्चे जवाब से थोड़ा संशोधित) के अनुसार:
channel_presence
इनबाउंड सेवा को सक्षम होना चाहिएinbound_services: - channel_presence
मॉड्यूल की yaml फाइल में इस इनबाउंड सेवा को सक्षम करना (उदाहरण के लिए, इस प्रश्न में
api.yaml
) इस सेवा को सक्षम नहीं करेगा।*/_ah
शुरू होने वाले यूआरएल पथ प्रेषणीय मार्ग नहीं हैं औरdispatch.yaml
द्वारा पीछा नहीं किया जा सकता। Yaml इसलिए,channel_presence
यूआरएल पथ हैंडलरों कोapp.yaml
में वर्णित किया जाना चाहिए।handlers: - url: /_ah/channel/connected/ script: mymodule.application