私は、それらが保護する必要がある権限チェックとビューの階層を持っています。たとえば、これらの2つのチェックを考えてみましょう。クラスベースのビューに適用されるデコレータの作成
def has_profile(user):
return user.profile is not None
def is_a_sorcerer(user):
return user.profile.category == 'sorcerer'
ユーザーがプロファイルを持っている場合はis_a_sorcerer
に電話するのが理にかなっています。
一部のビューは、プロファイルを持つ誰でもアクセス可能である必要があります。一部のビューは、魔法使いのみに制限されています。
class ProfileView(View):
@method_decorator(user_passes_test(has_profile))
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
class SorcererView(ProfileView):
@method_decorator(user_passes_test(is_a_sorcerer))
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
しかし、継承に、is_a_sorcerer
はhas_profile
前と呼ばれてエラーとなりますのでご注意。
それはis_a_sorcerer
にhas_profile
をチェックすることが可能である:これはエラーを修正しながら
def is_a_sorcerer(user):
return has_profile(user) and user.profile.category == 'sorcerer'
、それは二回has_profile
をチェックし、その結果、およびチェックの二つ以上のレベルのオーバーヘッドが急速に蓄積します。
コードを複製せずにこれらのデコレータを作成するにはどうすればよいですか?私は依然として権限チェックを関数として保持して、関数ベースのビューに適用できるようにしたいと考えています。
その継承の問題は何ですか?ユーザーにプロフィールがない場合、それは魔術師になることはできません。 'is_a_sorcerer'実装では、' has_profile 'もチェックする必要があります。 – afilardo
[権限](https://docs.djangoproject.com/ja/1.10/topics/auth/customizing/#custom-permissions)を使用することはできませんか? – afilardo
ビューに 'permission_required'デコレータを追加すると、' user_passes_test'と違うことはなく、依然としてパーミッションを2回チェックする必要があります。 – Koterpillar