8

重複の可能性:
Pythonデコレータを理解する

Pythonデコレータは何をしますか?また、メソッドにデコレータを追加したときに実行されているコードはどこで確認できますか?

たとえば@login_required、メソッドの先頭に追加すると、その行を置き換えるコードはありますか?この行はユーザーセッションをどの程度正確にチェックしますか?

4

3 に答える 3

5

メソッドの先頭に追加する@login_requiredと、その行を置き換えるコードはありますか?

すこし。ビュー関数の前に追加@login_requiredすると、これを行うのと同じ効果があります。

def your_view_function(request):
    # Function body

your_view_function = login_required(your_view_function)

Pythonのデコレータの説明については、以下を参照してください。

したがって、デコレータ関数は元の関数を受け入れ、(おそらく)元の関数を呼び出す関数を返しますが、他のことも行います。

の場合、login_requiredビュー関数に渡されたリクエストオブジェクトをチェックして、ユーザーが認証されているかどうかを確認すると思います。

于 2012-09-23T13:39:07.067 に答える
0

デコレータは、事実上、別の関数またはクラスをラップする関数です。あなたの場合のデコレータの背後にある関数は、という名前login_requiredです。それを見つけるためにあなたの輸入品を見てください。

于 2012-09-23T13:32:24.033 に答える
0

デコレータは、別の関数をラップする関数です。関数f(x)があり、デコレータh(x)があるとします。デコレータ関数は、引数として関数f(x)を取ります。したがって、実際には、新しい関数h(f(x))があります。 。たとえばlogin_requiredのように、よりクリーンなコードが作成されます。ユーザーがログインしているかどうかをテストするために同じコードを入力する必要はありません。代わりに、login_required関数で関数をラップして、そのような関数が呼び出される場合にのみ呼び出すことができます。ユーザーがログインしています。以下のこのスニペットを確認してください

def login_required(restricted_func):
"""Decorator function for restricting access to restricted pages.
Redirects a user to login page if user is not authenticated.
Args:
    a function for returning a restricted page
Returns:
    a function 
"""
def permitted_helper(*args, **kwargs):
    """tests for authentication and then call restricted_func if
    authenticated"""
    if is_authenticated():
        return restricted_func(*args, **kwargs)
    else:
        bottle.redirect("/login")
return permitted_helper
于 2012-09-23T13:36:40.137 に答える