대상 함수를 래핑하고 이 함수 앞뒤로 꾸며질 구문들에 대해 손쉽게 재사용할 수 있도록 다른 곳에 미리 함수를 만들어 두는 것. 로그인 데코레이터의 경우, 회원이 댓글 작성이나 특정권한을 가지고 있는지 확인하기 위해 데코레이터를 쓴다.
웹사이트 상에서 권한을 가진 유저만 이용가능한 서비스를 이용할 수 있는 곳에 한해, 유저가 로그인한 회원인지 이용가능한 권한을 가지고 있는지 등을 확인하기 위해 미리 선언해 둔 함수를 사용하기 위한 목적.
import jwt
import json
from django.http import JsonResponse
from .models import Accounts
from wespace.settings import SECRET_KEY
def login_decorator(func):
def wrapper(self, request, *args, **kwargs):
if "Authorization" not in request.headers:
return JsonResponse({"error_code":"INVALID_LOGIN"}, status=401)
encode_token = request.headers["Authorization"]
try:
data = jwt.decode(encode_token, SECRET_KEY, algorithm='HS256')
account = Accounts.objects.get(id=data['id'])
request.account = account
except jwt.DecodeError:
return JsonResponse({"error_code":"INVALID_TOKEN"}, status = 401)
except Accounts.DoesNotExist:
return JsonResponse({"error_code":"UNKNOWN_USER"}, status = 401)
return func(self, request, *args, **kwargs)
return wrapper
~
class Decorator(View):
@login_decorator
def get(self, request):
return JsonResponse({'nick_name' : request.account.nick_name})
from .views import Decorator
urlpatterns = [
path('/a', Decorator.as_view())
]