1

という名前の Django サイト用に別のアプリケーションを作成しrestricted

http://localhost:8000/restricted/

このアプリケーション全体へのアクセスを、特定のグループ (「制限付きグループ」と呼びましょう) のメンバーのみに制限できるようにしたいと考えています。

これを簡単に行う方法はありますか?おそらくurls.confファイルに?view.pyこのアプリはクラスベースのリストビュー (30 以上) でいっぱいなので、ファイル内のすべてのビューにこの種のチェックを適用するのは嫌です。

編集:これを修正するために、ビューに関数を追加しました:

def group_check(user):
    if user:
        return user.groups.filter(name='Restricted').count() >= 1
    return False

通常のビュー ( などindex) では、デコレータを配置します。

@user_passes_test(group_check)
def index(request):
    return render_to_response('listview/index.html')

クラスベースのリストビューの場合:

class MyListView1(ListView):
    context_object_name = "objs"
    queryset = MyList.objects.all()
    template_name = "listviews/mylist.html"

    @method_decorator(user_passes_test(group_check))
    def dispatch(self, *args, **kwargs):
        return super(MyListView1, self).dispatch(*args, **kwargs)

そして、再定義されたクエリセットを持つものの場合:

class MyListView1_Custom(ListView):
    context_object_name = "obj"
    template_name = "listviews/mylist_custom.html"

    @method_decorator(user_passes_test(group_check))
    def get_queryset(self):
        self.obj1 = get_object_or_404(MyList, id__iexact=self.args[0])
        self.context = {}
        self.context['custom'] = self.obj1
        return self.context

もちろん、これには以下をインポートする必要があります。

from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import user_passes_test

テストの結果、これはグループに基づいてビューを保護するのに適した方法であると結論付けました。「Restricted」グループに属していないユーザーは、デフォルトのログイン ページにリダイレクトされます。

詳細については、Django のドキュメント ページuser_passes_testを参照してください。別の場所にリダイレクトする方法も説明されています (必要に応じて、これを使用して 404 にリダイレクトできます)。

4

1 に答える 1