related_name

related.name

장고에서 모델을 설정할 때 Foreign키를 설정해주고 뒤에 related_name을 설정해준다.
related_name을 설정해주는 것은 장고의 ORM기능을 활용하기 위해서이다.

class Comment(models.Model):
    User = models.ForeignKey(User, on_delete=models.CASCADE, related_name= comment)

이렇게 related_name에 참조하고 싶은 값을 적으면 _set을 이용할 필요 없이
모델이 생성될 때 역참조가 되어서

user.comment.all()로 user가 가진 모든 코멘트를 가져올 수 있다.

related_name= user 로 써서 comment 모델이 user를 참조한다라고
잘못 쓰는 경우도 있으니
이 모델을 기준으로 생각하지 말고 앞에 쓰이는 변수 값을 기준으로
related_name= comment생각하면 편하다

장고 데코레이터

def login_decorator(func):
    def wrapper(self, request, *args, **kwargs):
        try:
            access_token = request.headers.get('Authorization')                   (1)
            payload = jwt.decode(access_token, SECRET_KEY, algorithms=ALGORITHM)  (2)
            user = User.objects.get(id=payload['id'])                          (3)
            request.user = user                                                   (4)

        except jwt.exceptions.DecodeError:                                     
            return JsonResponse({'message' : 'INVALID_TOKEN' }, status=400)

        except Account.DoesNotExist:                                           
            return JsonResponse({'message' : 'INVALID_USER'}, status=400)

        return func(self, request, *args, **kwargs)

    return wrapper

한참을 고민 했던 토큰 데코레이터다

1번부터 차례대로 코드를 보면

1. 프론트가 보내준 headers속에 들어있는 Authorzation에 들어있는 토큰 값을 가져온다.
2.우리가 encode해주었던 시크릿 키와 알로리즘 값을 이용해 가져온 토큰을 jwt로 decode해준다.
3. user에 있는 id값이랑 디코딩한 payload 값이랑 같은걸 가져온다.(여기서 어떤 유저인지 인식)
4. request.user에 그 값을 넣어준다.

처음엔 코드를 보고 엄청 막막하였는데.. 한줄 한줄 쳐다보며 직접실행해서 이해하였다.
특히 request.user = user 이 부분이 이해가 잘 가지 않았는데
(request.user라는 공간이 이미 있어서 거기에 값을 주는 줄 알앗다.)
dri() 함수를 이용하여 request를 본 결과 3번에서 user를 새로 생성해주는 것을 알게되었다.

출처
https://velog.io/@devmin/Django-decorator-login-token-basic

좋은 웹페이지 즐겨찾기