【发布时间】:2015-03-18 15:28:44
【问题描述】:
开始学习python,无法从yield return中获取返回值。谁能帮我一个忙。
我只想将一个令牌从 url 传递给 WSHandler,并从 tonadoredis(github:https://github.com/leporo/tornado-redis) get 方法获取 uid。 然后 blpop 一个名为 "noticeT" + uid 的列表,当 "noticeTuid" 有一个新项目时,我希望它返回到浏览器。
但我的代码无法运行,我该如何解决我的问题?
class WSHandler(tornado.websocket.WebSocketHandler):
res = {'code':200, 'info': ''}
def initialize(self):
self.c = tornadoredis.Client(host=CONFIG['REDIS_HOST'], port=CONFIG['REDIS_PORT'], password=CONFIG['REDIS_AUTH'])
self.logintoken = self.get_argument('logintoken')
self.noticeModel = noticeModel(self.logintoken, self.c)
def open(self):
print 'new connection'
# uid = yield tornado.gen.Task(self.c.get, self.logintoken)
# print uid
self.res['info'] = self.noticeModel.getNotice()
if self.res['info']:
print self.res
self.write_message(json_encode(self.res))
else:
self.res['code'] = 500
self.res['info'] = 'error'
self.write_message(json_encode(self.res))
def on_message(self, message):
print 'message received %s' % message
def on_close(self):
print 'connection closed'
def check_origin(self, origin):
# print origin
# return True
parsed_origin = urlparse(origin)
# print parsed_origin
return parsed_origin.netloc.endswith("localhost")
noticeModel 代码是:
class noticeModel :
def __init__(self, logintoken, redisobj):
self.logintoken = logintoken
self.redisobj = redisobj
# @tornado.web.asynchronous
@tornado.gen.engine
def getNotice(self):
# uid = self.setLoginUid()
uid = yield tornado.gen.Task(self.redisobj.get, self.logintoken)
print "getNotice uid is %s"% uid
# if self.uid:
print "getNotice logintoken is %s"% self.logintoken
key = "noticeT" + uid
key = key.encode('utf-8')
print 'listening key:%s'% key
yield tornado.gen.Task(self.redisobj.blpop, key, 0)
@tornado.gen.engine
def setLoginUid(self):
yield tornado.gen.Task(self.redisobj.get, self.logintoken)
【问题讨论】:
-
"我的代码不能工作" 什么不能工作?你有错误吗?