[Python] Decorator

mean_g·2022년 7월 21일
0

[ Python & Django ]

목록 보기
8/10

오설록 클론 코딩을 하면서 데코레이터를 사용해 보게 되었다.
개념부터 찬찬히 훑어보고 코드를 짜려고 정리를 해보았다.

1. 데코레이터(decorator)란?

  • 기존의 코드에 여러 가지 기능을 추가하는 파이썬 구문이다.
  • 추가할 기능의 함수를 wrapping 해서, 다양한 곳에 간단하게 재사용 할 수 있게 해준다.
  • 특정 함수가 실행되기 전에 먼저 실행되어, 사전에 하고 싶은 작업을 처리하는 함수

2. 데코레이터는 언제 사용할까?

  • 로그인한 사용자에게 토큰을 발행하고, 이 토큰을 새로운 요청마다 HTTP 리퀘스트 헤더에 넣어서 보내주면 로그인 상태를 유지시켜 준다. 이 토큰이 유효한 토큰인지 확인하기 위해 로그인 인증 데코레이터를 사용한다.
  • 데코레이터 함수를 재사용해서, main 함수에 대한 가독성과 직관성을 좋게 한다. (같은 패턴을 여러 번 사용하더라도 @만 붙이면 돼서 간편하다)
  • 사용자가 특정 기능을 수행하기 전, 사용자가 그 기능을 수핼할 권한이 있는지 확인한다.

3. 데코레이터를 사용해보자

TimeStamp모델을 위해 만들었던core라는 앱에 utils.py에 파일을 따로 생성해주었다.

#먼저 모듈들을 import해준다.
from django.http        import JsonResponse
from users.models       import User
from django.conf        import settings

def login_decorator(func):
    def wrapper(self, request, *args, **kwargs):
        try:

            access_token = request.headers.get('Authorization')
            #HTTPRequest의 헤더인 Authorization의 값을 가져온다.
            payload      = jwt.decode(access_token, settings.SECRET_KEY, settings.ALGORITHM)
            #토큰을 디코딩하면 나오는 사용자 정보이다. 디코딩에 사용되는 SECRET_KEY, ALGORITHM이 토큰 발행 시 넣은 정보와 동일해야 한다.
            user_id      = payload['id']
            #user_id에 payload에서 디코딩해서 나온 사용자 정보를 저장한다.
            request.user = User.objects.get(id = user_id)
            #request에 user변수를 저장한다. user변수에는 user_id와 일치하는 DB의 User 테이블의 사용자 정보를 넣어준다.
            
            return func(self, request, *args, **kwargs)

        except jwt.exceptions.DecodeError:
            return JsonResponse({ 'message' : 'INVALID_TOKEN' }, status = 400)
            #우리에게 없는 토큰 값이 들어오면 INVALID_TOKEN 에러를 반환한다.
        
        except KeyError:
            return JsonResponse({ 'message' : 'KEY_ERROR' }, status = 400)

    return wrapper





+)데코레이터에 대해 정리하면서 개념은 조금 잡힌 거 같은데 아직... 코드는 처음이라 그런지 두루뭉실하게 아는지 코드를 설명하기 조금 어렵다. 프로젝트가 끝나면 다시 한번 더 되돌아봐야 할 것 같다😇
profile
Backend Dev

0개의 댓글