상황:

패스트푸드 사이트에서 메뉴페이지신메뉴를 추가시킬 수 있는 권한관리자로그인한 경우만 가능하다.

따라서 관리자가 아닌 익명의 유저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







블로그 이미지

쵸잇

,