Tôi đang sử dụng Mô-đun Máy ứng dụng trong dự án python của mình. (https://developers.google.com/appengine/docs/python/modules/#Python_Background_threads)Mô-đun Python của Máy ứng dụng và dịch vụ kênh
Tôi cũng đang sử dụng các kênh truyền hình trong m dự án: https://developers.google.com/appengine/docs/python/channel/
Tôi muốn trực tiếp các thông điệp bài/ngắt kết nối kết nối ('/ _ah/kênh/kết nối /', '/ _ah/kênh/ngắt kết nối/') vào mô-đun api của tôi. Ngay bây giờ tôi không thể nhận được chúng để hiển thị trong bất kỳ mô-đun (mặc định hoặc 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
Lưu ý: Chỉ cần làm rõ điều này tất cả hoạt động trong chế độ dev cục bộ.
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)
Vì vậy, khách hàng của tôi (viết bằng javascript) bài viết để mô-đun api của tôi và mở ra một kênh.
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);
};
Chức năng gọi lại này đạt được với mã thông báo hợp lệ. Tôi tạo socket thành công và hoàn thành chức năng này như mong đợi. Trên hệ thống cục bộ của tôi, hàm onOpened sau đó được gọi và tôi nhận được các tin nhắn từ máy chủ. Trong sản xuất onOpened không bao giờ được gọi và tôi không bao giờ nhận được bất kỳ tin nhắn. Các/_ah/kênh/kết nối/cũng không bao giờ được gọi.
Dịch vụ kênh có được hỗ trợ với mô-đun không? Bất kỳ suy nghĩ nào về những gì tôi đang thiếu?
Cám ơn trả lời nhưng tôi sợ rằng không phải là vấn đề ở đây. Tôi đã không đăng mã ở đây nhưng tôi đã thêm các tuyến đường. Nó sẽ không hoạt động ở chế độ dev nếu tôi không làm vậy. –
Tôi đã thêm mã đó để cho bạn biết ý tôi là gì. –