重构Tornado请求处理程序

时间:2013-10-02 16:58:27

标签: python tornado yield

因此,我为许多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.finish方法中调用self.get_cache后立即重新停止它。

1 个答案:

答案 0 :(得分: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...