웹 API 만들기

소개



이 기사는 Volare Advent Calendar 2019의 21일째 담당분입니다.

이번에 처음 iOS 앱의 API를 만들어 보았습니다.
자신이 공부중인 것도 있고, DjangoRESTFramework를 사용해 API를 만들어 보았으므로, 그것을 기사로 해 가고 싶습니다
만든 앱의 iOS 측 기사는 여기

앱 정보



앱 제작에 있어서 메인의 타겟은 저희와 같은 혼자 사는 대학생입니다
앱이 결정한 경위에 대해서는
자취를 할 때 식단을 생각하는 것은 귀찮지만 기존 앱은 냉장고에 있는 것을 참조하여 검색을 하고 있다
→ 기존의 대상은 가족을 가진 사람을위한 것입니다.

좋아. 싫음을 입력하고 자동으로 식단을 제시해주는 앱이 있으면 편리하다고 느꼈다!
→ 기본적으로 만들어 두는 것은 별로 하지 않는다, 좋아하는 것을 좋아할 때에 만들고 싶다(냉장고에 식재료가 별로 들어 있지 않다 )

이런 요점에서 만드는 것을 결정했습니다! (컨셉이 같은 것이 없다면 만들어 버리자 )

함께 팀 개발을 한 류쨩이 앱에 대해 설명해주고 있습니다.
이번은 이쪽의 백엔드를 담당했습니다.

구현한 것



백엔드에서는 다음 5가지 기능을 구현했습니다!
  • 사용자 인증
  • 각 사용자의 재료 목록보기
  • 재료 선택 상태 일괄 변경
  • 재료의 무작위 표시

  • 이 중, 3개를 담당했으므로, 그 부분에 대해서 써 갑니다!

    사용자 인증


    from main.models import User, FoodConfigParam
    from main.serializers import AuthSerializer
    from rest_framework.generics import GenericAPIView
    from rest_framework.exceptions import AuthenticationFailed
    from rest_framework.response import Response
    import random
    
    from rest_framework_jwt.settings import api_settings
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    
    class RegisterAuthView(GenericAPIView):
        permission_classes = ()
        serializer_class = AuthSerializer
        def post(self, request):
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
    
            # uuidが登録されていたらtokenを返す
            if User.objects.filter(uuid=serializer.data['uuid']):
                user = User.objects.get(uuid=serializer.data['uuid'])
                payload = jwt_payload_handler(user)
                return Response({
                    'token': jwt_encode_handler(payload),
                })
    
            user = User.objects.create_user(uuid=serializer.data['uuid'])
            user.save()
            if not user:
                raise AuthenticationFailed()
            payload = jwt_payload_handler(user)
            # ユーザー登録をする時に、デフォルトの食材を追加する
            user = User.objects.filter(uuid=serializer.data['uuid']).last()
            food = FoodConfigParam()
            food.create_defaultfood(user=user)
            return Response({
                'token': jwt_encode_handler(payload),
            })
    

    보내진 UUID와 일치하는 사용자가 DB에 있는지 여부를보고, 그렇지 않으면 사용자를 만듭니다.

    사용자별 식재료 목록 표시 및 일괄 변경


    from main.models import FoodConfigParam
    from main.serializers import FoodConfigParamSerializer
    from rest_framework.generics import GenericAPIView
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    class UserFoodConfig(GenericAPIView):
        queryset = FoodConfigParam.objects.all()
        serializer_class = FoodConfigParamSerializer
    
        def get(self, request):
            foodConfigParams = FoodConfigParam.objects.filter(user=request.user)
            serializer = FoodConfigParamSerializer(foodConfigParams, many=True)
            return Response({'data': serializer.data})
    
        def put(self, request):
            res = []
            for config in request.data['data']:
                name = config['name']
                rate = config['rate']
                # 登録ユーザーと食材名が一致するものを抽出
                foodConfigParam = FoodConfigParam.objects.get(user=request.user, name=name)
                # 確率を変更
                serializer = FoodConfigParamSerializer(foodConfigParam, data={'rate': rate}, partial=True)
                serializer.is_valid(raise_exception=True)
                serializer.save()
                res.append(serializer.data)
            return Response({'data': res})
    

    사용자와 재료 이름이 일치하는 것을 추출하여 출현율을 변경하도록 했습니다.

    어려웠던 일



    만들어 보았던 API가 잘 움직이지 않거나 움직였지만 iOS와 연결했을 때 예상하지 못한 움직임이 되거나
    iOS측에서는 최대한 로직을 쓰지 않게 하거나, 통신 횟수를 줄이거나 등 여러가지 있는 것 같고,
    더 프런트 측의 지식도 제대로 가져 두지 않으면 의사 소통을 할 수 없어서 힘든 일이 되지 말라고 느꼈습니다・・・
    iOS 측과 상담하고, 이렇게 하면 하기 쉽다든가를 토론하면서 진행해 가서, 과연~과 공부가 되었습니다.

    결론



    이번에는 우선 움직이는 것, 라고 만들고 있었으므로, RESTful이 아직도 모르고 있습니다
    그래서 django-rest-framework의 장점을 제대로 알고, 장점을 살릴 수 있도록 공부하려고 생각했습니다.
    끝까지 읽어 주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기