简体   繁体   English

在Tornado中,如何“装饰”协程GET功能

[英]In Tornado, How to 'decorate' a coroutine GET function

I want to decorates the GET coroutine method, which determines whether needs to read the data from cache and set the data to cache. 我想装饰GET协程方法,该方法确定是否需要从缓存中读取数据并将数据设置为缓存。 But i don't know how to wrap a coroutine. 但我不知道如何包装一个协程。 Here is how i do it now: 我现在就是这样做的:

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

But it's not working. 但它不起作用。 Please let me know how to do it and where i'm wrong. 请让我知道怎么做以及我错了。

Af first. 首先是Af。 coroutine should be fixed(Just add return): coroutine应该修复(只需添加返回):

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

And here also should be fixed: 这里也应该修复:

class IndexHandler(BaseHandler):

Now you can cache result buffer(note: it's list). 现在您可以缓存结果缓冲区(注意:它的列表)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM