웹페이지에서 로그인 정보를 유지하기 위해 사용되는 데코레이터에 대해 알아보겠습니다.
먼저 데코레이터에 대해 간단히 설명하자면,
대상 함수를 wrapping하고 이 함수 앞뒤로 꾸며질 구문들에 대해 손쉽게 재사용할 수 있도록 다른 곳에 미리 함수를 만들어 둔 것이라고 볼 수 있습니다. 예로 들자면, 회원이 제품 구매를 위해 장바구니에 상품을 담는 특정권한을 가지고 있는지 확인하기 위해 데코레이터를 구현할 수 있습니다.
ex)사용예시
@decorator
def cart():
~~~~~
개발순서는 회원가입과 로그인을 먼저 구현하고, 데코레이터를 구현해야 하는데 목적과 로직은 아래와 같습니다.
구현하고자 하는 데코레이터의 목적
웹사이트 상에서 권한(로그인, 혹은 관리자)을 가진 유저만 이용가능한 서비스를 이용할 수 곳에 한해서, 유저가 로그인한 유저인지, 이용가능한 권한을 가진 유저인지(게시판 글쓰기, 관리자페이지 이용권한, 포스팅 작성, 장바구니 접속 등) 등을 확인하기 위해서 미리 선언해 둔 함수를 사용하기 위한 목적
로직
import jwt, json, requests
from django.http import JsonResponse
from django.core.exceptions import ObjectDoesNotExist
from my_settings import ALGORITHM, SECRET_KEY
from users.models import User
def login_decorator(func):
def wrapper(self, request, *args, **kwargs):
try:
access_token = request.headers.get('Authorization', None)
print('token', access_token)
payload = jwt.decode(access_token, SECRET_KEY, algorithms=ALGORITHM)
print('payload', payload)
request.user = User.objects.get(id=payload['id'])
except jwt.exceptions.DecodeError:
return JsonResponse({'MESSAGE':'INVALID_TOKEN'}, status=400)
except User.DoesNotExist:
return JsonResponse({'MESSAGE':'INVALID_USER'}, status=400)
return func(self, request, *args, **kwargs)
return wrapper
코드 설명