[Django] Django-rest-framework로 GET, POST, PUT, DELETE 구현하기: APIView

2022. 9. 14. 14:50Back-end/Django

반응형

APIView

  • Class-Based-View입니다. 따라서 상속이 가능합니다.
  • APIView를 상속받은 클래스 내부에 HTTP Method인 POST, GET, PUT, DELETE 함수를 정의할 수 있습니다.

클래스 내부에 POST, GET, PUT, DELETE 구현하기

메소드를 구현하면 Request가 도달했을때 해당되는 메소드가 실행됩니다. 이전의 글에 이어서 설명하겠습니다.

간단하게 요약하자면 Person 모델에는 name과 age가 저장되며 pk는 Djnago에서 기본으로 만들어준 id입니다.

 

[Django] 서버의 DB를 RESTful API로 접근하기: Django-rest-framework

Django-rest-framework RESTful API에 해당합니다. Model-View-Controller(MVC) 패턴을 따릅니다. RESTful API REST의 원리*를 따르는 API입니다. * HTTP URI/ HTTP Method/ HTTP message pay load REST API의 설..

oliopasta.tistory.com

 

0. class 생성하기

PersonListAPI는 DB에 등록된 모든 사람을 볼 수 있게 구현하고(GET), 새로운 사람을 등록합니다.(POST)

PersonDetailAPI는 사람 1명에 대한 정보를 가져오고(GET), 정보를 수정하며(PUT), 삭제할 수 있게 구현합니다.(DELETE) 접근, 수정, 삭제를 편하게 하기 위해 pk를 이용합니다.

 

1. GET 구현하기

PersonListAPI

Person.objects.all()로 DB 전체의 객체를 가져옵니다.

PersonSerializer로 모든 사람의 정보를 json 형식으로 변환합니다.

 

PersonDetailAPI

GET 요청을 받으면 get_object에 pk를 전달하여 해당 객체를 가져옵니다.

PersonSerializer로 pk에 해당하는 사람의 정보를 json 형식으로 변환합니다.

from .models import Person
from .serializers import PersonSerializer
from django.shortcuts import get_object_or_404

class PersonListAPI(APIView):
    def get(self, request):
        queryset = Person.objects.all()
        serializer = PersonSerializer(queryset, many=True)
        return Response(serializer.data)
        
        
class PersonDetailAPI(APIView):
    def get_object(self, pk):
        return get_object_or_404(Person, pk=pk)

    def get(self, request, pk):
        result = self.get_object(pk)
        serializer = PersonSerializer(result)
        return Response(serializer.data)

 

2. POST 구현하기

PersonListAPI

1. POST 요청을 받으면 PersonSerializer로 request의 data를 json 형식으로 변환합니다. 단, 값들이 DB에 삽입이 가능한지 검사하기 위해 is_valid()로 유효성 검사를 해야 합니다.

2. 유효성 검사를 통과했다면 data를 저장합니다.

3. 통과하지 못했다면 error를 반환합니다.

class PersonListAPI(APIView):
    def get(self, request):
        ...

    def post(self, request):
        serializer = PersonSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors)

 

3. PUT 구현하기

PersonDetailAPI

1. PUT 요청을 받으면 get_object()에 pk를 전달하여 해당되는 사람을 객체를 가져옵니다.

2. PersonSerializer로 기존 객체와 request 받은 객체를 함께 전달하여 json 형식으로 변환합니다.

3. 유효성 검사를 거쳐서 통과하면 수정사항을 저장합니다.

class PersonDetailAPI(APIView):
    def get_object(self, pk):
        ...

    def get(self, request, pk):
        ...

    def put(self, request, pk):
        result = self.get_object(pk)
        serializer = PersonSerializer(result, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors)

 

4. DELETE 구현하기

PersonDetailAPI

1. DELETE 요청을 받으면 pk에 해당하는 객체를 가져옵니다.

2. 객체를 삭제합니다.

 

class PersonDetailAPI(APIView):
    def get_object(self, pk):
		...

    def get(self, request, pk):
    	...
        
    def put(self, request, pk):
        ...

    def delete(self, request, pk):
        result = Person.objects.get(id=pk)
        result.delete()
        return Response(status=204)

 

5. URL 지정하기

프로젝트 폴더의 urls.py를 다음과 같이 수정합니다.

http://127.0.0.1:8000/api/person/ 에서 모든 사람의 정보를 볼 수 있습니다.

http://127.0.0.1:8000/api/person/1 에서 pk인 id가 1인 사람의 정보를 볼 수 있습니다.

from django.contrib import admin
from django.urls import path
from tempApp.views import PersonListAPI
from tempApp.views import PersonDetailAPI

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/person/', PersonListAPI.as_view()),
    path('api/person/<int:pk>/', PersonDetailAPI.as_view()),
]

결과 확인하기

서버를 실행하고 http://127.0.0.1:8000/api/person/ 으로 이동합니다.

Request 될 영역에 {"name": "Kim", "age": 1234} 형식으로 입력한 뒤 POST하면 정상적으로 데이터가 입력되는 모습을 확인할 수 있습니다.

 

http://127.0.0.1:8000/api/person/id 번호 로 이동합니다. 위 사진에서는 http://127.0.0.1:8000/api/person/7 에 해당합니다. 사람 1명의 정보만 보이며 GET, PUT, DELETE의 요청을 할 수 있습니다.

 

반응형