파이썬은 데코레이터(decorator)라는 기능을 제공합니다. 데코레이터는 장식하다, 꾸미다라는 뜻의 decorate에 er(or)을 붙인 말인데 장식하는 도구 정도로 설명할 수 있습니다.
말이 쉽지...ㅠㅠ
실습을 통해 익혀 봅시다.
def trace(func):
def wrapper():
print(func.__name__, '데코레이터 on!')
func()
print(func.__name__, '데코레이터 off!')
return wrapper
@trace
def hello():
print('hellow')
hello()
<결과>
hello 데코레이터 on!
hellow
hello 데코레이터 off!
전에 진행했던 westagram에 적용해 봅시다.(posting)
def login_decorator(func):
def wrapper(self, request, *args, **kwargs) :
try:
access_token = request.headers.get('Authorization')
payload = jwt.decode (access_token, SECRET_KEY, algorithms=ALGORITHM)
user = User.objects.get(id = payload['user'])
request.user = user
except jwt.exceptions.DecodeError:
return JsonResponse({'massage' : 'INVALID_TOKEN'} , status = 400 )
except User.DoesNotExist:
return JsonResponse({'massage' : 'INVALID_USER'} , status = 400 )
return func(self, request, *args , **kwargs)
return wrapper
class PostView(View):
@login_decorator
def post(self, request):
try:
data = json.loads(request.body)
user = request.user
contents = data['contents']
image_list = data['images'].split(',')
url_check = "^.*\.(jpg|jpeg|gif|png|bmp|tiff|tga|svg)$"
for image in image_list:
if not re.match(url_check, image):
return JsonResponse({'message' : 'INVALID_IMAGES!!'}, status = 401)
post_content = Post.objects.create(contents = contents, user = user)
for image in image_list:
Image.objects.create(images = image, post = post_content)
return JsonResponse({'massage':'SUCCESS'}, status = 200)
except KeyError:
return JsonResponse({'massage':'KEY_ERROR123'}, status =400)
로그인이 진행되기 전 토큰을 검사하여, 토큰이 유효한지(토큰과 pk값 비교)를 확인하고 그 다음 함수가 진행되게끔 했다.