Djangoでテストに合格したユーザへのアクセスを制限する方法

2042 ワード

アクセス制限は、ある権限に基づいて、いくつかのチェック、またはloginビューに異なる場所を提供することができ、これらの実装方法はほぼ同じである.
一般的な方法は、直接ビューのrequestである.userでチェックを実行します.例えば、次のビューでは、ユーザがログインpollsがあるかどうかを確認する.can_vote権限:

def vote(request):
 if request.user.is_authenticated() and request.user.has_perm('polls.can_vote')):
  # vote here
 else:
  return HttpResponse("You can't vote in this poll.")


Djangoにはuser_という名前がありますpasses_testの簡潔さ.パラメータを受け入れて指定した場合に装飾器を生成します.

def user_can_vote(user):
 return user.is_authenticated() and user.has_perm("polls.can_vote")

@user_passes_test(user_can_vote, login_url="/login/")
def vote(request):
 # Code here can assume a logged-in user with the correct permission.
 ...


user_passes_testは必須パラメータを使用します.Userオブジェクトが存在し、ユーザーがページの表示を許可したときにTrueに戻る呼び出し可能なメソッドです.注意user_passes_testは自動的にUserをチェックしない
認証するかどうかは、自分でやるべきだ.
例では、2番目のオプションパラメータlogin_も示します.urlは、ログインページのURL(デフォルトは/accounts/login/)を指定します.ユーザーがテストに合格しなかった場合user_passes_testはユーザーをlogin_にリダイレクトしますurl
ユーザーに特別な権限があるかどうかを確認するのは比較的一般的なタスクである以上、Djangoはこのような状況に近道を提供しています:permission_required()装飾器.このアクセサリーを使用すると、前の例を次のように書き換えることができます.

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote', login_url="/login/")
def vote(request):
 # ...


注意、permission_required()にはオプションのlogin_もありますurlパラメータ、このパラメータはデフォルト'/accounts/login/'です.
汎用ビューへのアクセスを制限
Djangoユーザーメールリストで最も多く質問されたのは、汎用ビューへの制限アクセスです.この機能を実現するには、自分でビューをパッケージし、URLconfで自分のバージョンを汎用ビューに置き換える必要があります.

from django.contrib.auth.decorators import login_required
from django.views.generic.date_based import object_detail

@login_required
def limited_object_detail(*args, **kwargs):
 return object_detail(*args, **kwargs)


もちろん、ロゴを他の限定修飾子で置き換えることができます.required .