время расчета декоратора с flask -restplus - PullRequest
0 голосов
/ 03 марта 2020

Я пишу вебапи, используя flask и flask -restplus. Я создал декоратор для расчета времени выполнения вызова API.

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

Вот как я его использую ...

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

Проблема возникает, когда декоратор вызывает выше контроллера оттуда отсутствует метод и найденный аргумент. Вот точное сообщение об ошибке ...

"get() missing 1 required positional argument: 'self'",

Я пробовал Google, но не повезло.

Я пытался с простым методом декоратора, как показано ниже ...

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

и это работает отлично. Проблема возникает, когда я делаю это как класс, а не как метод.

1 Ответ

0 голосов
/ 03 марта 2020

Ваш TimeCalculateDecorator вызывает упакованную функцию, не передавая ссылку на правильный экземпляр MultipleEmp_controller.

Я не уверен, как вы получите правильную ссылку, используя чистые декораторы, но вот способ реализовать декорирование метода во время инициализации класса:

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

Также стоит рассмотреть этот ответ .

...