在龙卷风中,如何“装饰”一个协同程序GET函数

2024-06-28 14:34:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我想修饰getcoroutine方法,它决定是否需要从缓存中读取数据并将数据设置为cache。但我不知道如何包装一个合作计划。我现在是这样做的:

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})

但它不起作用。请告诉我怎么做,我错在哪里。在


Tags: keyselfcachegetifdefbufferargs
1条回答
网友
1楼 · 发布于 2024-06-28 14:34:51

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

这里也应该修正:

^{pr2}$

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

相关问题 更多 >