首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有flask-restplus的时间计算装饰器

带有flask-restplus的时间计算装饰器
EN

Stack Overflow用户
提问于 2020-03-03 15:37:57
回答 1查看 104关注 0票数 0

我正在使用flask和flask-restplus编写一个webapi。我已经创建了一个装饰器来计算执行api调用的时间。

代码语言:javascript
复制
import time

class TimeCalculateDecorator:

    def __init__(self, func): 
        self.function = func 

    def __call__(self,*args, **kws): 
            ts = time.time()
            result = self.function(*args, **kws)
            te = time.time()
            print('func:%r args:[%r, %r] took: %2.4f sec' % \
              (self.function.__name__, args, kw, te-ts))
            return result

这就是我如何使用它..。

代码语言:javascript
复制
class MultipleEmp_controller(Resource):


    @inject
    def __init__(self,api, dataservice:DataServiceBase):
        self.service = dataservice

    @TimeCalculateDecorator
    def get(self):
        """Get Request for version 1"""
        emp_schema = EmployeeSchema(many=True)
        emps = emp_schema.dump(self.service.getemployees())
        return emps

当装饰器调用上述控制器方法时,发现那里缺少self参数,问题就来了。下面是确切的错误消息...

代码语言:javascript
复制
"get() missing 1 required positional argument: 'self'",

我试过谷歌,但没有成功。

我试着使用简单的方法装饰器,如下所示。

代码语言:javascript
复制
def timeit(method):
    def timed(*args, **kw):
        ts = time.time()
        result = method(*args, **kw)
        te = time.time()
        print('func:%r args:[%r, %r] took: %2.4f sec' % \
          (method.__name__, args, kw, te-ts))
        return result
    return timed

这一切都运行得很好。当我把它作为类,而不是方法时,问题就来了。

EN

回答 1

Stack Overflow用户

发布于 2020-03-03 22:22:27

您的TimeCalculateDecorator正在调用包装函数,但没有传入对正确MultipleEmp_controller实例的引用。

我不确定如何使用纯装饰器获得正确的引用,但这里有一种在类初始化期间实现装饰性方法的方法:

代码语言:javascript
复制
import time

class TimeCalculateDecorator:
    def __init__(self, func, **kwargs): 
        self.function = func 

    def __call__(self,*args, **kws): 
            ts = time.time()
            result = self.function(*args, **kws)
            te = time.time()
            print('func:%r args:[%r, %r] took: %2.4f sec' % \
              (self.function.__name__, args, kws, te-ts))
            return result

class MultipleEmp_controller(object):
    def __init__(self, *args, **kwargs):
        self.get = TimeCalculateDecorator(self.get)
        return  

    def get(self):
        """Get Request for version 1"""
        print('called')
        return 


if __name__ == '__main__':
    x = MultipleEmp_controller()
    x.get()

另外,值得回顾一下这个answer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60502249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档