2017-06-16 7 views
1

ボトルアプリケーションにaccess_rightsデコレータを追加して、ルートにアクセスする際のアクセス許可を確認しようとしています。しかし、それは装飾された関数の引数を取得していないので、装飾された関数を再び呼び出すときにエラーが発生します。ここでデコレータが引数を取得していません

はデコレータを使用してコードの例です:

@route('/users') 
@access_rights({'POST': ['admin']}) 
def users(user): 
    pass 

userパラメータがリクエストで渡されたトークンからユーザーを取得し、私が書いたボトルのプラグインから来ています。これは私の現在のデコレータです:

これにより
def access_rights(permissions): 
    def decorator(f):  
     def wrapper(*args, **kwargs): 
      # Check permissions rights here (not implemented yet) 

      return f(*args, **kwargs) 

     return wrapper 

    return decorator 

GET /usersを行うとき、私はargskwargsが空の両方た意味、TypeError: users() takes exactly 1 argument (0 given)を取得します。次のように私は、デコレータを変更する場合しかし、それは動作します:

def access_rights(permissions): 
    def decorator(f): 
     return f 

    return decorator 

私はデコレータでたくさん働いていませんが、私の理解から、上記の両方の実装が元のパラメータでusers関数を呼び出す必要があり、まだのために何らかの理由で最初のものがパラメータを取得しない。何故ですか?

+1

このコードは私にとっては役に立ちます。 2番目のデコレータ構文が機能するなら、それは引数でそれを使用していないことを意味します。つまり、 '@access_rights(何でも)'ではなく@access_rightsだけを実行しているということです。 –

+0

おそらく関数名のどこかがチェックされていますか?その場合、ラッパーの上にある '@ functools.wraps(f)'が役立つはずです。 – Artyer

+0

py2またはpy3を使用していますか?私はそれが大きな違いをもたらすとは思わないが、私は好奇心が強い。 –

答えて

0

ルートハンドラ関数usersには、1つのパラメータが必要です。

ただし、デコレータaccess_rightsは、usersを囲み、userのパラメータを渡していません。受け取ったパラメータを渡すだけです(この場合、エラーメッセージの「0指定」部分はありません)。

例が明確になるはずです。

from bottle import route, Bottle 

app = Bottle() 

def access_rights(permissions): 
    def decorator(f): 
     def wrapper(*args, **kwargs): 
      # Check permissions rights here (not implemented yet) 

      the_user = 'ron' # hard-coded for this example 

      return f(the_user, *args, **kwargs) 

     return wrapper 

    return decorator 


@app.route('/users') 
@access_rights({'POST': ['admin']}) 
def users(user): 
    return ['hello, {}'.format(user)] 


app.run(host='127.0.0.1', port=8080, debug=True) 

注意私が作った唯一の実質的な変化はaccess_rightsが実際にラインの下に、ユーザーのparamを渡す持っていたこと:ここにあなたの元のコードに基づいて、小さいながらも完全な作業アプリは、です。 (どのようにしてユーザーが自然にあなた次第であるかを判断する - あなたのコメントであなたが呼んだのは "まだ実装されていない"部分だろう)。

希望に役立ちます!

+0

'user'パラメータが渡されていないことは間違いなく理解していますが、それは私のデコレータの仕事ではありません。私の質問で述べたように、 'user'パラメタは生成され、プラグインによって渡されるので、デコレータによって処理されるべきではありません。私には分かりませんが、渡された引数で 'f'を呼び出す' wrapper'の代わりに 'f'を直接返すことは、同じ結果をもたらさないということです。私はここで何が欠けていますか? – PLPeeters

関連する問題