본문 바로가기

Django

django / 데코레이터(decorator) 사용권한 인증 구현 (로그인, 비로그인)

 

 

🔶 Python Decorator 기능

각 페이지별로 사용권한을 주기 위해 사용하는 기능, @를 앞에 붙여서 사용함

/ Decorator가 없어도 해당 페이지에서 구현가능하지만 동일한 기능을 할 때, function 으로 빼듯이 코드의 간결성을 위함

 

ex) 목록페이지, 공지사항페이지 등이 있는 사이트라면 목록은 A그룹만 볼 수 있고, 공지사항은 B그룹만 볼 수 있게 지정혹은, 로그인을 하지 않은 경우 해당 페이지 못보도록 막기

 

 

 

 

 

0. 현재상황

현재 django 로그인은 django에서 구현하는 방식이 아닌 DB 체크로 하는 중.

 

 


 

 

1. Usage

 

App에 decorators.py 파일 생성

 

 

from django.shortcuts import redirect


def is_login(func):   #데코레이터 명명
    def decorated(request, *args, **kwargs):

        session = request.session.get('user')    # 로그인시 저장한 사용자 아이디 session 부름
        
        # 세션 여부 체크
        if(session != None or session == ''):      # 있다면 통과
            return func(request, *args, **kwargs)
        else:                                      # 세션 없다면, 로그인 창으로 return    
            return redirect('/')


    return decorated

로그인 여부 확인 하는 Decorator 만들기 위해 decorator.py 파일에 해당 내용 추가 

 

 

🔸함수형 일때

@is_login
def prdt_list(request):

사용하고자하는 views.py 파일에 가서 함수위에 @데코레이터 이름 으로 사용 

 

 

🔸클래스형 일때

@method_decorator(is_login, 'get')
@method_decorator(is_login, 'post')
class Prdt_write(View):
    def get(self, request):
    def post(self, request):

클래스형일때는 위에 method_decorator(데코레이터이름, '데이터전송방식') 을 사용

 

 


 

 

2. Check

데코레이터가 어떤 순서로 작동하는지 확인해보기

 

 

decorators.py

from django.shortcuts import redirect


def is_login(func):
    def decorated(request, *args, **kwargs):
        print("in decorator")
        session = request.session.get('user')
        print("check session")
        print("is there session info?")

        if(session != None or session == ''):
            print("yes")
            return func(request, *args, **kwargs)
        else:
            return redirect('/')

    return decorated

 

 

 

views.py (목록보여줄 method)

@is_login
def list(request):
    print("in list")

 

 

 

 

 

terminal (print 찍힌 순서대로 확인💛)

 

순서를 보면 list 함수 위에 @is_login 이라는 데코레이터를 정의하면 

decorator의 log가 먼저 찍힌 후에 list 함수내 log가 찍히는걸 확인 할 수 있다.

 

 

 

 

 


 

🔹 추가

def login(func):
    def decorated(request, *args, **kwargs):

        user_agent = get_user_agent(request)

        session = request.session.get('user')
        session_typ = request.session.get('user_typ')

        if session:
            if session_typ == 'U':
                return func(request, *args, **kwargs)

        if(get_user_agent(request).is_pc):
            return HttpResponseRedirect('/login')
        else:
            return HttpResponseRedirect('/m/login')

    return decorated

이 부분은 사용자 타입 (관리자/일반사용자) 구분에 따라, 접근형태(pc/mobile)에 따라 처리하고자 만들었던 decorator

 

 

 

https://docs.djangoproject.com/en/3.2/topics/http/decorators/

반응형