2017-04-18 107 views
0

我寫了一個登錄裝飾器,應該保證在執行另一個函數之前用戶已正確登錄。問題是,雖然裝飾器正在按預期工作,但函數包裝函數從不執行。我的結構如下所示: 修飾器不調用封裝函數

#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 /裝飾裏面假的,但它並沒有改變任何東西。

回答

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是否被調用,但這是裝飾而不是如何工作。他們替換與裝飾器返回的任何原始函數;如果你返回一個新函數,那個新函數負責調用原始函數(如果需要的話),其他人不會爲你做。

+0

哦,那太愚蠢了。我從來沒有稱過我的函數func,所以顯然沒有被調用。非常感謝你! – Depa