프로젝트/서평사이트

[고양이와 책을] 로그인 정보 넘기기(Django - QuerySet)

파뱁 2022. 2. 10. 00:34
728x90

기존 로그인의 post 코드에는 status와 message만 파라미터로 넘겼었다.

프론트에서 로그인 정보를 가지고 다른 작업을 해야 하므로, uid(고유 유저 번호), userName, userEmail의 정보를 JsonResponse로 넘기고자 했다.

 

현재 요구사항은 프론트에서 넘어온 유저 이메일을 통해 데이터베이스에 접근해서 uid와 userName을 꺼내오는 것이다.

이를 위해 우리는 모델의 object 객체를 이용할 것이다.

그 중에서도 특정 조건을 달아 받아올 수 있는 filter()를 이용해서 받아온 유저 이메일이 존재 하는 지 확인을 할 것이다.

if User.objects.filter(userEmail = data['userEmail']).exists() == True:

만약 존재 한다면, 같은 구문을 이용해서 정보를 받아올 것인데 이때 주의할 점은 모델의 object 객체는 쿼리셋(들)을 반환한다는 것이다.

이를 우리는 values()를 통해 딕셔너리 구조로 가져올 것이다. ()안에 특정 키를 넣으면, 해당하는 값만을 딕셔너리로 가져오게 되므로, id와 userName만을 받아올 것이다.

userData = User.objects.filter(userEmail = data['userEmail']).values('id','userName')[0]

위의 코드에서 [0]이 붙는 이유는 쿼리셋이 객체(딕셔너리)들이 있는 리스트 구조 이기 때문이다. 우리는 filter를 통해 하나의 값만 가져온다는 것을 전재로 하기 때문에(기능명세상 userEmail 값은 중복되지 않음) [0]을 작성해서 정확히 해당 딕셔너리 자료를 선택하고, 그것을 userData라는 변수에 저장했다.

이후에는 그 딕셔너리 데이터를 key 값으로 접근해 각 데이터의 value 값을 변수에 저장했다.

userName = userData.get('userName')
uid = userData.get('id')

마지막으로 이 데이터를 리턴하는 JsonResponse에 넣어서 보내면 끝이다.

return JsonResponse({"message": "로그인에 성공하셨습니다.",
                     "userEmail": data['userEmail'], "uid": uid, "userName":userName}, status = 200)

전체 LoginView 클래스의 코드는 다음과 같다.

class LoginView(View):
    def post(self, request):
        data = json.loads(request.body)
        
        User(
            userEmail = data['userEmail'],
            userPw = data['userPw'],
        )

        if User.objects.filter(userEmail = data['userEmail']).exists() == True:
            userData = User.objects.filter(userEmail = data['userEmail']).values('id','userName')[0]
            print(userData.get('userName'))

            userName = userData.get('userName')
            uid = userData.get('id')

        if User.objects.filter(
        		userEmail = data['userEmail'],  userPw = data['userPw']).exists() == True :
            return JsonResponse({"message": "로그인에 성공하셨습니다.",
                                 "userEmail": data['userEmail'], "uid": uid, "userName":userName}, 
                                 status = 200)
        else:
            return JsonResponse({"message" : "아이디나 비밀번호가 일치하지 않습니다."}, status = 401)

 

728x90
반응형