코드리뷰 [1]

BackEnd_Ash.log·2020년 3월 21일
0

회원가입

class UserView(View):

    def post(self, request):
        new_user = json.loads(request.body)

        if User.objects.filter(user_name=new_user['user_name']).exists():
            return JsonResponse({'message' : '이미 존재하는 아이디입니다.'}, status=400)

        else:
            password = bytes(new_user['user_password'], "utf-8")
            hashed_password = bcrypt.hashpw(password, bcrypt.gensalt())

            new_user = User(
                user_name = new_user['user_name'],
                user_password = hashed_password.decode("UTF-8"),
                user_gender = new_user['user_gender']
            )
            new_user.save()

            user_settings = UserOption(
                hate_hot = False,
                hate_cold = False,
                user = new_user
            )
            user_settings.save()

            return JsonResponse({'message' : '회원가입을 축하드립니다.'}, status=200)

우선적으로 user_name 에 아무것도 적지 않았을경우 ,
물론 프론트 단에서 해결을 할 수 있는 문제지만 , 백엔드 에서도 처리를 해줘야한다 .
그래서 항상 None 값이 들어오는것에 대해 대비를 해야한다.

class UserView(View):

    def post(self, request):
        try :
            new_user = json.loads(request.body)
            name = new_user.get('user_name' , None)
            password = new_user.get('user_password' , None)
            gender = new_user.get('user_gender' , None)

            if User.objects.filter(user_name=name).exists():
                return JsonResponse({'message' : '이미 존재하는 아이디입니다.'}, status=400)

            new_user = User(
                user_name = name
                user_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
                user_gender = gender
            ).save()

            user_settings = UserOption(
                hate_hot = False,
                hate_cold = False,
                user = new_user
            ).save()

            return return HttpResponse(status=200)

        except TypeError:
            return JsonResponse({'message':'INVALUD_TYPE'},status=400)

이렇게 바꿀 수 있겠다 . 그런데 만약 user_name 과 등등이 None 같이 들어가면 안된다고 하면 아마 .. 또 코드가 달라졌을것 같다 .

로그인

class AuthView(View):

    def post(self, request):
        login_user = json.loads(request.body)
        try:
            user = User.objects.get(user_name=login_user['user_name'])
            encoded_jwt_id = jwt.encode({'user_id' : user.id}, wtwt_secret, algorithm='HS256')

            if bcrypt.checkpw(login_user['user_password'].encode("UTF-8"), user.user_password.encode("UTF-8")):
                return JsonResponse(
                            {
                                "access_token" : encoded_jwt_id.decode("UTF-8"),
                                "user_gender" : user.user_gender
                            }
                        )
            else:
                return JsonResponse({'message' : '비밀번호를 다시 확인해주세요.'}, status=400)

        except ObjectDoesNotExist:
            return JsonResponse({'message' : '등록되지 않은 아이디입니다.'}, status=400)
        except Exception as e:
            print(e)
            return HttpResponse(status=500)

로그인 하는 view 인것 같은데 일단은 AuthView 라는 naming 만 보고 저것이 로그인 하는 view 인것을 확인 할 수 있을까 ?? 라는 생각이 들었다.
그리고 print 같은경우 지워주는것이 좋다.

class AuthView(View):

    def post(self, request):
        login_user = json.loads(request.body)
        try:
            user = User.objects.get(user_name=login_user['user_name'])

            if bcrypt.checkpw(login_user['user_password'].encode("UTF-8"),user.user_password.encode("UTF-8")):

                 jwt = jwt.encode({'user_id' : user.id},
                                        wtwt_secret,
                                        algorithm='HS256').decode("UTF-8") # algorithm 같은경우도 my_settings 에 빼는것이 좋다.

                return JsonResponse(
                            {
                                "token"       : jwt
                                "user_gender" : user.user_gender},status=200)

            return HttpResponse(status=400)

        except ObjectDoesNotExist:
            return HttpResponse(status=400)

        except TypeError:
            return HttpResponse(status=400)

데코레이터

def login_decorator(f):        
    def wrapper(self, request, *args, **kwargs):
        access_token = request.headers.get('Authorization', None)

        try:                   
            if access_token:   
                decoded = jwt.decode(access_token, wtwt_secret, algorithms=['HS256'])
                user_id = decoded["user_id"]    
                user = User.objects.get(id=user_id)
                request.user = user             
    
                return f(self, request, *args, **kwargs)
            else:              
                return HttpResponse(status=401) 
        except jwt.DecodeError:
            return HttpResponse(status=401) 

    return wrapper

개인적인 생각으로 f 보다는 알아볼 수 있게 function 이라던지 func 까지 naming 을 해주는것이 더 좋을 것 같다는 생각을 한다 .
그리고 else 문 같은경우는 빼도 아무런 지장이 없을 것 같다 .

def login_decorator(func):        
    def wrapper(self, request, *args, **kwargs):
        access_token = request.headers.get('Authorization', None)

        try:                   
            if access_token:   
                decoded = jwt.decode(access_token,
                                     wtwt_secret,
                                     algorithms=['HS256'])

                user_id = decoded["user_id"]    
                user = User.objects.get(id=user_id)
                request.user = user             

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

            return HttpResponse(status=401) 

        except jwt.DecodeError:
            return HttpResponse(status=401) 

    return wrapper

Category

class HeartView(View):

    @login_decorator
    def post(self, request):
        user     = request.user
        cloth    = json.loads(request.body)
        cloth_id = cloth['img_id']
        cloth    = Cloth.objects.get(id = cloth_id)

        if cloth.hearts.filter(id = user.id).exists():
            cloth.hearts.remove(user)
            heart_cloth = False
        else:
            cloth.hearts.add(user)
            heart_cloth = True

        return JsonResponse({"total_hearts" : cloth.total_hearts, "heart_cloth" : heart_cloth})
    
    @login_decorator
    def get(self, request):
        user        = request.user
        hearts      = HeartTime.objects.filter(user_id=user.id).values('cloth_id','heart_time').order_by('-heart_time')
        hearts_list = list(hearts)
        cloth_id    = [
            {
                'img_id'       : d['cloth_id'], 
                'img_ref'      : Cloth.objects.get(id = d['cloth_id']).img_ref,
                'page_ref'     : Cloth.objects.get(id = d['cloth_id']).page_ref,
                'total_hearts' : Cloth.objects.get(id = d['cloth_id']).total_hearts
            } for d in hearts_list
        ]

        return JsonResponse({'hearts_list' : cloth_id})

이코드를

class HeartView(View):

    @login_decorator
    def post(self, request):
        user       = request.user
        cloth_data = json.loads(request.body)
        cloth_id   = cloth_data.get('img_id' , None)
        cloth      = Cloth.objects.get(id = cloth_id)

        if cloth.hearts.filter(id = user.id).exists():
            cloth.hearts.remove(user)
            heart_cloth = False
        else:
            cloth.hearts.add(user)
            heart_cloth = True

        return JsonResponse({"total_hearts" : cloth.total_hearts,
                             "heart_cloth" : heart_cloth} , status=200)

    @login_decorator
    def get(self, request):
        user       = request.user
        heart_list = HeartTime.objects.filter(user_id = user.id).select_related('cloth').order_by('-heart_time').all()
        cloth_id    = [
                {
                    'img_id'       : hearts.cloth_id,
                    'img_ref'      : hearts.cloth.img_ref,
                    'page_ref'     : hearts.cloth.page_ref
                    'total_hearts' :hearts.cloth.total_hearts
                } for hearts in heart_list]

        return JsonResponse({'hearts_list' : cloth_id},status=200)

일단 이렇게 바꿨는데 사실 이 코드도 ..
저기 post 부분에서도 else 문을 알쓰고 할 수 있었을 것이다 .

profile
꾸준함이란 ... ?

0개의 댓글