2017-04-18 39 views
0

別の関数を実行する前に、ユーザーが正しくログインしていることを保証するログインデコレータを作成しました。問題は、デコレータが期待どおりに動作しているにもかかわらず、関数ラップ関数が決して実行されないことです。私はすでにデコレータ内部True/Falseのリターンを削除しようとしたが、それは何も変更しませんでした デコレータがラップされた関数を呼び出さない

#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 

:私の構造は、次のようなものです。

答えて

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

関連する問題