Reputation: 181
I wrote a websocket demo for real-time push, but my code not work...
I want to get the value from yield ( uid = 89 ) return to the self.res['info']
how to do that?
websocket demo:
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'
self.res['info'] = self.noticeModel.getNotice()
print self.res
if self.res['info']:
r = self.res['info']
print r.result()
# self.write_message(json_encode(self.res))
else:
self.res['code'] = 500
self.res['info'] = 'error'
self.write_message(json_encode(self.res))
And the noticeModel code like this:
import tornado.gen
import tornado.web
class noticeModel :
def __init__(self, logintoken, redisobj):
self.logintoken = logintoken
self.redisobj = redisobj
# @tornado.web.asynchronous
# @tornado.gen.coroutine
@tornado.gen.engine
def getNotice(self):
self.uid = yield tornado.gen.Task(self.redisobj.get, self.logintoken)
print "getNotice uid is %s"% self.uid
I run it in the iTerm and get this output :
new connection
{'info': None, 'code': 200}
getNotice uid is 89
Upvotes: 0
Views: 568
Reputation: 24007
make WSHandler.open a coroutine, and yield getNotice:
class WSHandler(tornado.websocket.WebSocketHandler):
@tornado.gen.coroutine
def open(self):
print 'new connection'
self.res['info'] = yield self.noticeModel.getNotice()
And make getNotice a coroutine, too:
class noticeModel :
@tornado.gen.coroutine
def getNotice(self):
self.uid = yield tornado.gen.Task(self.redisobj.get, self.logintoken)
See my refactoring article:
http://emptysqua.re/blog/refactoring-tornado-coroutines/
Upvotes: 1