ボトルアプリケーションに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
を行うとき、私はargs
とkwargs
が空の両方た意味、TypeError: users() takes exactly 1 argument (0 given)
を取得します。次のように私は、デコレータを変更する場合しかし、それは動作します:
def access_rights(permissions):
def decorator(f):
return f
return decorator
私はデコレータでたくさん働いていませんが、私の理解から、上記の両方の実装が元のパラメータでusers
関数を呼び出す必要があり、まだのために何らかの理由で最初のものがパラメータを取得しない。何故ですか?
このコードは私にとっては役に立ちます。 2番目のデコレータ構文が機能するなら、それは引数でそれを使用していないことを意味します。つまり、 '@access_rights(何でも)'ではなく@access_rightsだけを実行しているということです。 –
おそらく関数名のどこかがチェックされていますか?その場合、ラッパーの上にある '@ functools.wraps(f)'が役立つはずです。 – Artyer
py2またはpy3を使用していますか?私はそれが大きな違いをもたらすとは思わないが、私は好奇心が強い。 –