DRF FBV 방식으로 API View 만들기
DRF 함수 기반 뷰 방식으로 API View 만들기
DRF에서 API view 를 만드는 방법
DRF를 이용하여 API 를 설계하는 방법에는 django와 마찬가지로 FBV, CBV 두 가지로 나뉜다.
- FBV - 함수 기반 뷰
- @api_vew : 자유도가 가장 높다
- CBV - 클래스 기반 뷰
- APIView : @api_view 와 거의 동일하다고 보면 된다.
- generics View : 다양한 CRUD 조합 별로 클래스가 구성되어 있다.
- ViewSet : 자유도는 비교적 낮은 편이지만 개발에 필요한 코드는 가장 적다.
- router를 이용하여 URI 설계가 가능하다.
@api_view 데코레이터를 이용한 FBV 방식 API 설계
이번 글에서는 가장 자유도가 높은 api_view 데코레이터를 이용한 방식을 사용해보겠다.
기본적인 코드 작성법
아무런 퍼포먼스 없이 하나의 리소스 만을 CRUD 하는 로직을 기준으로 코드를 작성해봤다.
@api_view(['GET', 'POST'])
def memo(request):
if request.method == 'GET':
memo = Memo.objects.all()
serializer = MemoSerializer(memo, many=True)
return Response(serializer.data, status= status.HTTP_200_OK)
elif request.method == 'POST':
memo = MemoSerializer(data=request.data)
if memo.is_valid():
memo.save()
return Response(status=status.HTTP_201_CREATED)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
@api_view(['GET','PUT','DELETE'])
def memo_detail(request,pk):
memo = Memo.objects.get(id=pk)
if request.method == 'GET':
serializer = MemoSerializer(memo)
return Response(serializer.data, status=status.HTTP_200_OK)
if request.method == 'PUT':
serializer = MemoSerializer(memo, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(status=status.HTTP_201_CREATED)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
if request.method == 'DELETE':
memo.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
코드를 대충 보면 알겠지만 django에서 form으로 데이터를 처리하는 것과 거의 동일하다.
특징
- @api_view() 데코레이터
- api view 데코레이터를 사용함으로서 request method에 대한 제약을 둘 수 있다.
- 그 외에도 DRF의 여러 API view와 관계된 기능들을 사용할 수 있도록 한다.
- Serializer
- Form 과 매우 유사한 기능을 하는 Serializer를 사용한다.
- 일반적으로 Form은 HTML 상에서 form 태그에서 받은 data를 사용하지만 Serializer는 request에 전달 된 json 데이터를 사용한다.
- Response
- DRF의 Response를 사용함으로서 HTTP 상태 코드와 data를 전달할 수 있다.
- 데이터는 직렬화되어 있는 형태여야 한다.
함께 사용 가능한 데코레이터
-
@renderer_classes(…)
- 렌더러 설정
-
@parser_classes(…)
- 파서 설정
-
@authentication_classes(…)
- 인증 방식 설정
-
@throttle_classes(…)
- 호출 횟수 설정
-
@permission_classes(…)
- 권한 설정
댓글남기기