【问题标题】:In Tornado, How to 'decorate' a coroutine GET function在 Tornado 中,如何“装饰”协程 GET 函数
【发布时间】:2015-06-26 17:45:08
【问题描述】:

我想装饰 GET 协程方法,它决定是否需要从缓存中读取数据并将数据设置为缓存。但我不知道如何包装协程。这是我现在的做法:

def cache_it(f):
    @functools.wraps(f)
    @coroutine
    def wrapper(self, *args, **kwargs):
        key = self.get_cache_key()
        result = cache.get(key)
        if not result:
            yield f(self, *args, **kwargs)
            if self._result_buffer:
                cache.set(key, self._result_buffer)
        else:
            self._result_buffer = result 

class BaseHandler(RequestHandler):
    def __init__(self, *args, **kwargs):
        super(BaseHandler, self).__init__(*args, **kwargs)
        self._result_buffer = []

    def write(self, chunk):
        self._result_buffer.append(chunk)

    def flush(self, include_footers=False, callback=None):
        self._flush_result_buffer()
        super(BaseHandler, self).flush(include_footers)

    def finish(self, chunk=None):
        if chunk is not None:
            self.write(chunk)
        self._flush_result_buffer()
        super(BaseHandler, self).finish()

    def _flush_result_buffer(self):
        for r in self._result_buffer:
            super(BaseHandler, self).write(r)
        self._result_buffer = []

class IndexHandler(RequestHandler):

    @cache_it
    @coroutine
    def get(self):
        ...
        self.write({'data': data})

但它不起作用。请让我知道该怎么做以及我错在哪里。

【问题讨论】:

    标签: python tornado coroutine python-decorators


    【解决方案1】:

    Af 优先。 协程应该是固定的(只需添加返回):

    def cache_it(f):
        @functools.wraps(f)
        @coroutine
        def wrapper(self, *args, **kwargs):
            key = self.get_cache_key()
            result = cache.get(key)
            if not result:
                yield f(self, *args, **kwargs)
                if self._result_buffer:
                    cache.set(key, self._result_buffer)
            else:
                self._result_buffer = result 
        return wrapper
    

    这里也应该修复:

    class IndexHandler(BaseHandler):
    

    现在您可以缓存结果缓冲区(注意:它是列表)。

    【讨论】:

    • 嗨@sinceq,它现在可以工作了,但是现在我在异步内存缓存操作中遇到了另一个问题。我试过github.com/dpnova/tornado-memcache,但我不知道如何在协程中使用它(cache_it 函数中的包装器)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 2016-06-15
    相关资源
    最近更新 更多