2つのデコレータ(ログインの確認用とis_activeの確認用)でDjangoビューをデコレートしようとしています。Djangoのビュー用の複数のデコレータ:実行順序
最初のものは、内蔵で@login_required
あり、2つ目は、以下の通りである。
def active_required(function):
dec = user_passes_test(lambda u: u.is_active, '/notallowed', '')
return dec(function)
、裏返しPythonの仕事でデコレータは、しかし、次のように動作しません:
@active_required
@login_required
def foo(request):
...
私はまず、ユーザーがログインしているかどうかをチェックし、そうでなければログインページにリダイレクトし、ログインしている場合はそのユーザーがアクティブかどうかをチェックし、そうでない場合はリダイレクトを実行します'/notallowed'
。何が起こる
はlogin_requiredが失敗した場合、ユーザーはログインページにリダイレクトされていないということですが、@active_required
が実行され、ユーザーはその場合にはnullであることから、@active_requiredデコレータは失敗し、ユーザーが/notallowed
にリダイレクトされます。
、
@login_required
@active_required
def foo(request):
...
が、私はあまりにもこのアプローチに問題があると思います。
2つのデコレータを組み合わせる適切な方法と、実行順序が単純なPythonデコレータと異なる理由は何ですか?
ええ、私はまだ注文について少し混乱しています:http://stackoverflow.com/a/739665/72436とhttp://stackoverflow.com/a/8715839/72436そうでないと示唆しています。 – ustun
OK、私はあなたがそれを釘付けにしたと思います。違いは、それを呼び出す関数と関数を返すことにあります。 – ustun