2013-10-02 42 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...