상황:
패스트푸드 사이트에서 메뉴페이지에 신메뉴를 추가시킬 수 있는 권한은 관리자로 로그인한 경우만 가능하다.
따라서 관리자가 아닌 익명의 유저가 URL를 직접 입력하여 관리자의 권한이 필요한 페이지로 접근을 하려고한다.
1) User 모델의 속성 중 하나인 "is_anonymous"를 활용한다.
다른 속성인 "is_authenticated"는 해당 유저가 인증이 되었는지 유무를 알려준다.
"is_anonymous"는 User와 AnonymousUser 객체의 차이를 두기 위해 사용한다.
확인을 위해서는 request.user.is_anonymous 형태로 사용된다.
1 2 | if request.user.is_anonymous: return redirect("/partner/login/") | cs |
익명의 사용자라는 것이 확인되면 로그인 페이지로 리다이렉트한다.
2) 1)번을 간편하게 쓸 수 있는 login_required 데코레이터를 활용한다.
1 2 3 4 | from django.contrib.auth.decorators import login_required @login_required(login_url='/accounts/login/') def my_view(request): | cs |
view 함수 위에 해당 데코레이터와 로그인 페이지를 입력하면 AnonymousUser를 즉시 로그인 페이지로 리다이렉트 처리한다.
**
데코레이터를 반복적으로 여러 뷰 함수에 사용하는 경우 (login_url='/accounts/login/') 부분이 중복되므로 상수처리한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | URL_LOGIN = '/accounts/login/' @login_required(login_url=URL_LOGIN) def my_view(request): @login_required(login_url=URL_LOGIN) def your_view(request): @login_required(login_url=URL_LOGIN) def his_view(request): @login_required(login_url=URL_LOGIN) def her_view(request): | cs |
**
새로운 상황:
접근 권한이 필요한 페이지에 URL을 통해 직접 접근한 경우,
login_required 데코레이터에 의해 로그인 페이지로 넘어가는데,
이때 login_required 데코레이터는 로그인한 경우 해당 페이지로 리다이렉트해주는 기능이 포함되어있다.
그러나 로그인 뷰에 의해 해당 페이지가 아닌 로그인 뷰에 지정된 페이지로 리다이렉트가 된다.
로그인 후 해당 페이지로 즉시 이동하려면?
URL을 살펴보면, "127.0.0.1:8000/partner/login/?next=/partner/menu/"이다.
URL 중 쿼리스트링으로 작성된 부분인 "?next=/partner/menu/"에서 "next"의 값으로 "/partner/menu/" URL를 갖고 있다.
이 쿼리스트링 부분을 login_required 데코레이터가 만들어 준 것이다.
로그인 뷰에서 GET 방식을 통해 URL에서 "next" 값을 호출하여 "next_value"라는 변수로 정의한다.
조건을 만들어서 URL에 "next" 값이 존재한 경우에는 그 값에 해당하는 URL로 리다이렉트하고,
"next" 값이 존재하지 않다면 메인페이지로 이동하도록 한다.
1 2 3 4 5 6 7 | if user is not None: auth_login(request, user) next_value = request.GET.get("next") if next_value: return redirect(next_value) else: return redirect("/partner/") | cs |
'코딩 연습 > Django' 카테고리의 다른 글
조건에 따라 링크 페이지 노출 (0) | 2018.12.06 |
---|---|
그룹에 속한 사용자만 접속 가능한 페이지 (0) | 2018.12.05 |
객체 지우기 (0) | 2018.12.02 |
2개의 폼(추가, 수정)에 1개의 템플릿만 사용하기 (0) | 2018.12.02 |
이미지를 저장하기(DB, Form, Url, Settings) (0) | 2018.12.02 |