프로젝트 이전 잘 만들어진 데코레이터를 살펴보고, 분석하며
데코레이터에 대해 완벽히 이해하고 프로젝트에 돌입하자!
로그인 데코레이터를 작성하는 파일(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 = 종속)