2022. 9. 14. 14:50ㆍBack-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의 요청을 할 수 있습니다.
'Back-end > Django' 카테고리의 다른 글
[Django] Django로 만든 앱을 배포하기: Pythonanywhere (0) | 2023.01.31 |
---|---|
[Django] Django의 DB에 INSERT, SELECT, UPDATE, DELETE하기: QuerySet (0) | 2022.09.02 |
[Django] 서버의 DB를 RESTful API로 접근하기: Django-rest-framework (0) | 2022.08.25 |
[Django] CORS 해결하기: django-cors-headers (0) | 2022.08.21 |
[Django] Mac의 Safari에서 CORS 해결하기 (0) | 2022.08.21 |