1
from decorator import decorator
from pylons.decorators.util import get_pylons

def allowed_roles(roles):
    def wrapper(func, *args, **kwargs):
        session = get_pylons(args).session
        # edit pylons session here.
        return func(*args, **kwargs)
    return decorator(wrapper)

誰がそれがどのように機能するか説明できますか?

4

1 に答える 1

2

他のデコレータ作品と同様に -

デコレータは、関数を引数として受け取り、別の関数を返す関数です。返された関数は、元の関数から「取って代わられます」。

デコラトの望ましい効果は、通常、元の関数 (デコレートされている関数) の実行前後に何らかのコードを実行できるようにすることであるため、デコレータは、任意の数の匿名および名前付きパラメーター (プレフィックスの "args " と "kwargs" の前に付けられた ** は、パラメーターをそれぞれリストと辞書に格納する責任があります)

この新しい関数内には、検証コードを記述する場所があります。次に、元の関数を呼び出します。このコンテキストでは「func」と呼ばれ、元の値を返します。

「decorator.decorator」呼び出しは厳密には必要ありません。ラッパー関数のいくつかの属性を変更して、元の関数 (「func_name」属性など) により近く見えるようにしますが、コードはそれがなくても機能するはずです。

デコレーターを定義したら、デコレーターを装飾したい関数またはメソッドに適用する必要があります。装飾したい関数定義の前に @allowed_roles を行に入れるだけです。

于 2009-11-27T12:09:30.727 に答える