웹 API 만들기
13803 단어 django-rest-framework파이썬장고
소개
이 기사는 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의 장점을 제대로 알고, 장점을 살릴 수 있도록 공부하려고 생각했습니다.
끝까지 읽어 주셔서 감사합니다.
Reference
이 문제에 관하여(웹 API 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/oyoyoa/items/bc6cda761be682b2bafe텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)