채널 API에 문제가 있지만 프로덕션에서만 문제가 있습니다. dev 서버에서이 작동하지만 프로덕션에서 내 자바 스크립트에서 잘못된 + 토큰 오류가 발생하고 파이썬에서 여하튼 빈 오류가 발생합니다.채널 API - 프로덕션 환경에서 유효하지 않은 토큰, dev 서버에서 작동
내 서버 측 코드는 다음과 같습니다. 'channel_test'는 제 컨트롤러이고 'do_send_message'는 연기되는 함수이고 'send_message'는 try-except 블록이있는 래퍼입니다. 기본적으로 채널을 생성하고 토큰을 쿠키로 설정하며 카운터가 최대 100이 될 때까지 지연된 작업을 호출합니다. 작업이 실행될 때마다 채널을 통해 메시지를 보냅니다.
def channel_test(self, key):
if not users.is_current_user_admin(): return 403
client_id = self.user.email()+key
token = channel.create_channel(client_id, duration_minutes=10)
print 'token: %s' % token
self.response.set_cookie('token', urllib.quote(token))
deferred.defer(do_send_message, client_id, _queue='retry')
# channel communication
def send_message(client_id, msg):
"""
msg is a dict
"""
if client_id:
print 'client_id: ', client_id
try:
channel.send_message(client_id, json.dumps(msg))
print 'sent message %s' % msg
except Exception as e:
print 'something went wrong with msg, %s: %s, %s' % (msg, e, e.__str__())
else:
print 'not sending message; no client id'
def do_send_message(client_id, x=10):
time.sleep(1)
text = "here's a message! %s" % x
if x >= 100:
text = "Done!"
msg = {"text":text, "percent":x}
send_message(client_id, msg)
if x < 100:
deferred.defer(do_send_message, client_id, x+10, _queue='retry')
'send_message'가 호출 될 때마다 실패하지만 'e'는 아무 것도 출력하지 않습니다. 로그의 결과는 다음과 같습니다.
something went wrong with msg, {'text': "here's a message! 10", 'percent': 10}: ,
또한 클라이언트 측 JavaScript가 연결을 열지 못합니다. 'Invalide + token'오류가 발생합니다. 이것은 기본적으로 쿠키에서 토큰을 읽고, 연결을 열고, 메시지가 전달 될 때마다 메시지 == '완료!'메시지가 나타날 때까지 알림 트레이에 메시지를 씁니다. 그런 다음 페이지를 다시로드합니다. 하지만, 즉시 실패하고 onError는 'Object {description : "Invalid + token.", code : "401"}'을 출력합니다.
// globals
var channel, socket, hide;
var $msg = $('#channel-message');
var $bar = $('#notification-tray .progress-bar');
onMessage = function(obj){
var message = JSON.parse(obj.data);
if (message.percent !== undefined){
$bar.css('width', message.percent+'%');
}
switchMsg(message.text);
};
onOpen = function(){
$('#notification-tray').fadeIn();
$bar.css('width', '10%');
};
onClose = function(){
$('#notification-tray').fadeOut();
};
onError = function(err){
$('#notification-tray').fadeOut();
console.log(err);
};
function closeAndReload(){
socket.close();
$.removeCookie('token', {path:'/'});
$.removeCookie('hide', {path:'/'});
location.reload();
}
function switchMsg(msg){
$msg.fadeOut(function(){
$msg.html(msg);
$msg.fadeIn(function(){
if (msg == 'Done!'){
closeAndReload();
}
});
});
}
function initializeChannel(){
channel = new goog.appengine.Channel(token);
socket = channel.open();
socket.onmessage = onMessage;
socket.onopen = onOpen;
socket.onclose = onClose;
socket.onerror = onError;
}
$(function(){
token = $.cookie('token');
if (token !== undefined && token != ""){
initializeChannel();
}
});
프로덕션 환경에서이 문제가 발생하더라도 내 개발자 서버에서 완벽하게 작동합니다.
미리 감사드립니다.