2013-10-02 3 views
0

Итак, я повторяю код, который я делаю для многих GET, - проверяя, был ли ранее сохранен кеш и возвращался ли он, если он доступен.Рефакторинг обработчика запросов Tornado

код Я хотел бы получить рабочие выглядит так:

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.finish вызывается в методе self.get_cache.

ответ

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... 
Смежные вопросы