6

私が同意するhttps://stackoverflow.com/a/8715790/210481のコメントの 1 つによると、一方が他方に依存している場合、複数のデコレーターを避ける必要があります。

したがって、この例では、アクティブなユーザー向けのデコレーター「active_required」がある場合、同じビューで active_required と login_required の両方を使用する必要はありません。

「active_required」デコレーターの内部で「login_required」デコレーターを「呼び出される」ようにする必要があります。

djangoに付属している標準の「login_required」デコレーターでそれを行うことは可能ですか?

私の要件は次のとおりです: 1) ユーザーが認証されていない場合、私は彼を LOGIN_URL にリダイレクトする必要があります。アカウント 3) ユーザーが認証され、アクティブな場合、ユーザーはビューにアクセスできます

前もって感謝します

4

1 に答える 1

8

active_requiredあなたの質問について考えてみると、最初に単純なデコレータを作成する方が簡単であることがわかりました。user_passes_testで関数を使用できるため、これは非常に簡単django.contrib.auth.decoratorsです。

次に、質問は「login_requiredandactive_requiredを 1 つのデコレーターに結合するにはどうすればよいですか?」に変わります。次の関数を定義する必要があります。

  1. 引数としてビュー関数を取ります
  2. 両方のデコレータを適用して、新しいビュー関数を作成します
  3. 新しいビュー関数を返します

すべてをまとめると、次のようになります。

from django.contrib.auth.decorators import user_passes_test, login_required

active_required = user_passes_test(lambda u: u.is_active, login_url=REACTIVATE_URL)

def active_and_login_required(view_func):
    decorated_view_func = login_required(active_required(view_func))
    return decorated_view_func
于 2012-03-01T21:36:20.047 に答える