Decorator!

sh_awtylol4·2022년 3월 24일
0

Decorator란?

파이썬은 데코레이터(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값 비교)를 확인하고 그 다음 함수가 진행되게끔 했다.

profile
포기하는 그 순간이 바로 시합종료예요...

0개의 댓글