이번엔 로그인과 회원가입 뒤에 진행한 로그인 데코레이터에 대해서 적어본다.
# users > decorator.py
def login_decorator(func):
@wraps(func)
def wrapper(self, request, *args, **kwargs):
try:
access_token = request.headers.get('Authorization', None)
payload = jwt.decode(access_token, SECRET_KEY, ALGORITHM)
user = User.objects.get(id = payload["id"])
request.user = user #1
return func(self, request, *args, **kwargs)
except jwt.DecodeError:
return JsonResponse({"message" : "INVALID_TOKEN"}, status = 401)
except User.DoesNotExist:
return JsonResponse({"message" : "INVALID_USER"}, status = 401)
return wrapper
처음엔 이 데코레이터 또한 유효성 검사 중 하나라고 판단하여, utils.py
안에 같이 넣었었지만, 가독성도 떨어지기에 따로 관리됨이 마땅하다 판단되어 decorator.py
라는 파일을 만들어 관리하기로 하였다.
내가 여기서 기억하고 넘어가야할 부분이 한가지 있다.
이전 위스타그램에서 데코레이터를 작성할 때만해도 #1
부분이 이해가 되지 않았지만, 시간도 없고, 다들 그냥 그렇게 사용한다기에 나도 그렇게 따라갔다.
하지만 이번에 다시 한번 이를 사용하는 상황에 의미없는 복붙은 용납할 수 없었다.
내가 이해한 바, 그리고 멘토님이 조언해주신 바에 따르면, #1
부분의 의미는
request
객체에 user
라는 property
를 생성해서 해당 request
객체가 user
정보를 담아다주는 매개체 역할을 하는 것이다.
그렇기 때문에 앞선 포스팅에서 언급한 payload
의 id
키 값을 여기서 맞춰주어야 한다는 것이다.