重複の可能性:
Pythonデコレータを理解する
Pythonデコレータは何をしますか?また、メソッドにデコレータを追加したときに実行されているコードはどこで確認できますか?
たとえば@login_required
、メソッドの先頭に追加すると、その行を置き換えるコードはありますか?この行はユーザーセッションをどの程度正確にチェックしますか?
重複の可能性:
Pythonデコレータを理解する
Pythonデコレータは何をしますか?また、メソッドにデコレータを追加したときに実行されているコードはどこで確認できますか?
たとえば@login_required
、メソッドの先頭に追加すると、その行を置き換えるコードはありますか?この行はユーザーセッションをどの程度正確にチェックしますか?
メソッドの先頭に追加する
@login_required
と、その行を置き換えるコードはありますか?
すこし。ビュー関数の前に追加@login_required
すると、これを行うのと同じ効果があります。
def your_view_function(request):
# Function body
your_view_function = login_required(your_view_function)
Pythonのデコレータの説明については、以下を参照してください。
したがって、デコレータ関数は元の関数を受け入れ、(おそらく)元の関数を呼び出す関数を返しますが、他のことも行います。
の場合、login_required
ビュー関数に渡されたリクエストオブジェクトをチェックして、ユーザーが認証されているかどうかを確認すると思います。
デコレータは、事実上、別の関数またはクラスをラップする関数です。あなたの場合のデコレータの背後にある関数は、という名前login_required
です。それを見つけるためにあなたの輸入品を見てください。
デコレータは、別の関数をラップする関数です。関数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