weizhao
weizhao

Reputation: 181

how to get value from yield in tornado

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

Answers (1)

A. Jesse Jiryu Davis
A. Jesse Jiryu Davis

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

Related Questions