2013-10-02 97 views
0

所以我重复的代码,我对做很多的GET - 检查响应是否以前缓存并返回,如果它是可用的。重构龙卷风请求处理器

的代码,我想获得工作看起来像这样:

class Handler(web.RequestHandler): 

    @gen.coroutine 
    def get_cache(self): 
     try: 
      response = yield gen.Task(get_redis) 
     except: 
      logging.log() 
     if response: 
      self.finish(response) 
      raise gen.Return() 


    @gen.coroutine 
    @asynchronous 
    def get(self): 
     self.get_cache() 

     response = do_sql_get() 

     self.set_cache(key, response) 
     self.finish(response) 

现在所发生的事情是,它得到的缓存,如果有,但继续运行的代码的其余部分self.get。这样做对我来说很有意义,但我不知道如何在self.get_cache方法中调用self.finish以正确地重构它。

回答

2

get_cache应该返回一个值,指示是否完成请求或没有(或者它应该返回缓存的数据,并将其交给调用者来完成请求)。我会做下列之一:

@gen.coroutine 
def serve_from_cache(self): 
    response = yield gen.Task(get_redis) 
    if response: 
     self.finish(response) 
     raise gen.Return(True) 
    else: 
     raise gen.Return(False) 

@gen.coroutine 
def get(self): 
    if (yield self.serve_from_cache()): 
    return 
    # do work 
    yield self.set_cache(...) 

@gen.coroutine 
def get_cache(self): 
    return yield gen.Task(get_redis) 


@gen.coroutine 
def get(self): 
    resp = yield self.get_cache() 
    if resp: 
     self.finish(resp) 
     return 
    # do work...