装饰器没有调用包装函数

时间:2017-04-18 02:20:56

标签: python decorator python-decorators

我写了一个登录装饰器,应该保证用户在执行另一个功能之前已正确登录。问题是,虽然装饰器按预期工作,但函数包装函数永远不会执行。我的结构如下:

#This is my decorator
login_required(func):
    def func_wrapper(*args, **kwargs):  
        #do some operations
        return True #or False
    return func_wrapper

@login_required
def do_something(param1, param2, param3):
    print("This print is not executing")
    #continue the work that should be done after 
    #the user is authorized by the login decorator

我已经尝试在装饰器中删除返回True / False,但它没有改变任何东西。

1 个答案:

答案 0 :(得分:3)

您的包装函数从不调用func。如果要在调用包装器时调用func,请调用它,例如:

def login_required(func):
    def func_wrapper(*args, **kwargs):  
        #do some operations to determine if user logged in and allowed to do op
        if allowed:
            return func(*args, **kwargs)
        else:
            # Raise exception, return "auth required" sentinel value, whatever
    return func_wrapper

您的代码假设返回一个布尔值会以某种方式确定是否调用了包装的func,但这不是装饰器的工作方式。他们用装饰器返回的任何东西替换原始函数;如果你返回一个新函数,那个新函数负责调用原始函数(如果需要),没有其他人会为你做这个。