32. TIL (데코레이터 뜯어보기)

dream.log·2021년 8월 1일
0

TIL

목록 보기
31/42
post-thumbnail

프로젝트 이전 잘 만들어진 데코레이터를 살펴보고, 분석하며
데코레이터에 대해 완벽히 이해하고 프로젝트에 돌입하자!

로그인 데코레이터를 작성하는 파일(views.py)엔
SECRET_KEY 를 담은 my_settings 파일을 import 하고 시작해야 한다!
import 파일들을 잘~ 확인해주고 작성을 시작하자.

✅ Sample code

class loginDeco:
	def __init__ (self, original_function):
    	    original_function = original_function
    
	def __call__(self, request, *args, **kwargs):
            access_token = request.headers.get('Authorization')
    	    try:
     	    	access_token_payload = jwt.decode(access_token,SECRET_KEY, algorithms="HS256")
  	        signed_user = User.objects.get(id=payload['id'])
	        request.user = signed_user
        
                return self.original_function(self, request, *args, **kwarags)
      	     except jwt.exceptions.DecodeError:
                return JsonResponse({'MESSAGE' : 'INVALID_ACCESS_TOKEN'},status = 400(
             except KeyError:
                return JsonResponse ({'MESSAGE' : 'SIGN_UP_FIRST'}, status = 400)
        
       	return wrapper
       

✔️ class 안에 __init__ __call__ 값을 가지는 함수를 하나씩 만들어준다!
__call__ 함수는 클래스를 함수처럼 호출시킬 수 있는 함수이며, 데코레이터 함수의 wrapper 과 같은 역할을 해준다!
__call__ 함수는 self, request, 위치, 키워드 값을 가지고 있다.

✔️ try - except 구문을 적어주고, 이 안에는 JSON Web Token의 형태인 header/payload/signature로 구성이 되어있다.

✔️ access_token = request.headers.get('Authorization')
: HTTP 요청에서 인증(Authorization) 헤더 값을 읽은 후 access_token을 얻을 수 있다!

header에는 정보가 인코딩 돼 가장 첫 부분에 들어가게 된다.

✔️ access_token_payload = jwt.decode(access_token,SECRET_KEY, algorithms="HS256")
: JWT 암호화 시 사용한 SECRET_KEY와 해쉬 알고리즘을 활용해 token을 복호화 한 후 access_token_payload 변수에 할당해준다.

✔️ signed_user = User.objects.get(id=payload['id'])
: 복호화한 JWT의 사용자 id를 변수에 할당 이후 비교할 사용자의 id와 비교할 때 사용한다.

✔️ request.user = signed_user
: 요청이 들어온 유저와 signed_user 를 비교한다.

✔️ return self.original_function(self, request, *args, **kwarags)
: self.original_function 값에 __call__ 함수의 인자 값으로 들어간 값들을 반환해준다.

✔️ except error들을 정의해주고 반환해준다.

🌱 계속 헷갈렸던 개념 짚고가기
[ models.py의 Foreign Key ]

✔️ artist PK값을 참조하는 artist_songs 라는 Foreign Key가 있다면?

artist_songs = models.ForiegnKey(artist,on_delete = models.CASCADE)

: artist_songs는 model의 ForeignKey이다.
어떤 모델의 키냐면! [artist]라는 모델이다!
만약 artist라는 값이 삭제된다면 artist_songs의 값도 삭제된다! 라는 의미이다. (CASCADE = 종속)


출처 : (https://wave1994.tistory.com/66)
profile
한 걸음, 한 걸음 포기하지 않고 발전하는 Backend-developer 👩🏻‍💻 노션 페이지를 통한 취업 준비 기록과 회고를 진행하고 있습니다. 계획과 기록의 힘을 믿고, 실천하고자 합니다.

0개의 댓글