장고 Admin에서 각 user의 소속 그룹지정해줄 수 있다.

그리고 그룹에 따라 접속 가능한 페이지도 나눌 수 있다.



상황:

"partner" 그룹에 속한 유저만 해당 페이지에 접속 허용하고, 그 외 그룹에 속하지 않는 유저메인페이지리다이렉트한다.



1
2
3
4
def menu_add(request):
    ctx = {}
    if "partner" not in request.user.groups.all():
        return redirect("/")
cs


1) 그룹 데이터직접 접근한다.


조건문을 작성하여 해당 페이지에 접속한 유저의 그룹이 필요로하는 "partner" 값인지 유무를 따지고, 없다는 조건이 참이면 메인페이지로 리다이렉트한다.


단, 여기서도 동일한 내용의 코드를 여러 뷰 함수에 담아서 사용하는데에 발생하는 번거로움과 늘어나는 코드량이 문제가 될 수 있다.



2) 1)번과 동일한 기능은 갖춘 user_passes_test 데코레이터 활용하기


1
2
3
4
5
6
7
8
9
from django.contrib.auth.decorators import user_passes_test
 
URL_LOGIN = '/partner/login/'
 
def partner_group_check(user):
    return "partner" in user.groups.all()
 
@user_passes_test(partner_group_check, login_url=LOGIN_URL)
def menu_add(request):
cs


user_passes_test 데코레이터를 사용하기 위해서는 별도의 함수 작성이 필요하다.

함수명은 partner_group_check로서 유저의 그룹이 "partner"인지 확인하는 것으로 만약 거짓이라면 로그인 페이지리다이렉트하게 된다.


*매개변수를 user로 받는데, 이 user는 menu_add 함수의 request.user와 동일하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
URL_LOGIN = '/partner/login/'
 
def partner_group_check(user):
    return "partner" in user.groups.all()
 
@user_passes_test(partner_group_check, login_url=LOGIN_URL)
def menu_add(request):
 
@user_passes_test(partner_group_check, login_url=LOGIN_URL)
def menu_edit(request):
 
@user_passes_test(partner_group_check, login_url=LOGIN_URL)
def menu_delete(request):
cs


partner 그룹에 속한 유저만 사용해야하는 모든 경우에 데코레이터를 손쉽게 가져다 사용할 수 있다.




블로그 이미지

쵸잇

,