장고 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 그룹에 속한 유저만 사용해야하는 모든 경우에 데코레이터를 손쉽게 가져다 사용할 수 있다.
'코딩 연습 > Django' 카테고리의 다른 글
공통된 2개 뷰 함수를 1개로 만들어 호출해서 사용하기 (0) | 2018.12.06 |
---|---|
조건에 따라 링크 페이지 노출 (0) | 2018.12.06 |
로그인하지 않은 경우에는 접근 금지 (0) | 2018.12.05 |
객체 지우기 (0) | 2018.12.02 |
2개의 폼(추가, 수정)에 1개의 템플릿만 사용하기 (0) | 2018.12.02 |