App Engine Python模块和频道服务
我在我的python项目中使用App Engine模块。 (https://developers.google.com/appengine/docs/python/modules/#Python_Background_threads)
我也在使用m项目中的频道:https://developers.google.com/appengine/docs/python/channel/
我想将已连接/断开连接的邮件消息('/ _ah / channel / connected /','/ _ah / channel / disconnected /')指向我的api模块。 现在我无法让它们出现在任何模块中(默认或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
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)
所以我的客户端(用javascript编写)发布到我的api模块并打开一个频道。
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);
};
这个回调函数是通过一个有效的令牌达到的。 我成功创建套接字并按预期完成此功能。 在我的本地系统上,onOpened函数然后被调用,并且我从服务器接收消息。 在onOpened生产是从来没有打电话,我从来没有收到任何消息。 / _ah / channel / connected /也不会被调用。
Channel服务是否不支持模块? 有什么想法,我失踪了?
根据谷歌企业支持(稍微修改他们的原始答案):
channel_presence
入站服务必须在app.yaml
启用。
inbound_services:
- channel_presence
在模块的yaml文件中启用此入站服务(例如,此问题中的api.yaml
)将不会启用此服务。
以*/_ah
开头的URL路径不是可分派路径,不能由dispatch.yaml
路由。 因此,必须在app.yaml
描述channel_presence
URL路径处理程序。
handlers:
- url: /_ah/channel/connected/
script: mymodule.application
你必须声明hadler路由来连接和disconects网址。
main.py
Handler路由:
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)
...
我碰到了在模块中使用Channel API的问题,并试图通过Emil提到的将请求重定向到模块的类似技巧来解决这些问题。
这是一个稍微复杂的设置,因为我实际上有3个模块,其中2个使用Channel API,一个是“前端”。 像这样的东西:
我希望能够听取来自前端两个独立服务的“通知”。
我设法解决这个问题的方法是在前端添加重定向到前端,后者读取我在每个服务前加上前缀的令牌,并重定向到每个服务。
“太好了,它有用!” 我想,但是当我试图部署到应用引擎时,我意识到这里有更多内容,因为Channel API内部使用的talkgadget端点似乎期望某个源应用,因此不允许跨域通信。
所以我最终使用了多个项目而不是模块,并通过放置HTML iframe“postMessage桥”来解决跨域问题。 很高兴它运行得非常好,作为副作用,我可以使用两倍的“免费”频道。
我在这里发现了一个与此相关的问题,可能会对您进行跟踪:https://code.google.com/p/googleappengine/issues/detail?id=10293
链接地址: http://www.djcxy.com/p/91621.html上一篇: App Engine Python Modules and channel service
下一篇: Google App Engine The url "/" does not match any handlers error