이전 포스팅에서 기본적인 장고 REST API 프레임 워크의 셋업 방법과 간단한 사용 방법에 대해 알려드렸습니다.
https://android-developer.tistory.com/80
https://android-developer.tistory.com/81
지금까지는 Function-based Views를 만들었지만
이번 포스팅에서는 Class-based Views로 Views를 만드는 방법에 대해 알려드리겠습니다.
Django REST API의 Class-based Views
지금까지는 Function-based Views로 만들었기 때문에
다음과 같이 함수를 호출해서 거기서 GET, PUT, POST, DELETE를 구분지어 API를 제어했습니다.
@api_view(['GET', 'PUT', 'DELETE'])
def movie_detail(request, pk):
if request.method == 'GET':
try:
movie = Movie.objects.get(pk=pk)
except Movie.DoesNotExist:
return Response({'Error': '존재하지 않는 데이터를 참조했습니다'}, status=status.HTTP_404_NOT_FOUND)
serializer = MovieSerializer(movie)
return Response(serializer.data)
if request.method == 'PUT':
serializer = MovieSerializer(movie, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
if request.method == 'DELETE':
movie = Movie.objects.get(pk=pk)
movie.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
하지만, Class-based Views를 사용하면 Class를 호출하여 거기서 GET, PUT, POST, DELETE에 대한 함수를 만들고
각각의 함수로 역할을 나눌 수 있기 때문에 좀 더 가독성이 높아졌다고 할 수 있습니다.
거기에 공통된 부분은 전역변수나 공통 함수를 새롭게 만들어 사용할수도 있기 때문에 대부분의 경우에는
Class-based Views를 사용합니다.
아래의 코드는 위에 있는 코드와 같은 역할을 하지만 Class-based Views로 바꾼 코드입니다.
class MovieListAV(APIView):
def get(self, request):
movies = Movie.objects.all()
serializer = MovieSerializer(movies, many=True)
return Response(serializer.data)
def post(self, request):
serializer = MovieSerializer(data = request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors)
class MovieDetailAV(APIView):
def get(self, request, pk):
try:
movie = Movie.objects.get(pk=pk)
except Movie.DoesNotExist:
return Response({'Error': '존재하지 않는 데이터를 참조했습니다'}, status=status.HTTP_404_NOT_FOUND)
serializer = MovieSerializer(movie)
return Response(serializer.data)
def put(self, request, pk):
movie = Movie.objects.get(pk=pk)
serializer = MovieSerializer(movie, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk):
movie = Movie.objects.get(pk=pk)
movie.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
여기서 APIView 클래스는 다음 깃허브에서 확인할 수 있습니다.
https://github.com/encode/django-rest-framework/blob/master/rest_framework/views.py
간단히 APIView 클래스의 역할을 설명하자면
- 클라이언트로 받은 요청을 적헐한 포맷으로 파싱/렌더링하는 역할
- HTML, JSON, XML 등 다양항 형태로 반환해줄 수 있음
- 인증 및 권한 관리
- 예외 처리
참고로 파싱 / 렌더링은 다음과 같습니다.
- 요청 파싱 = 클라이언트가 보낸 데이터를 서버(파이썬)가 이해할 수 있게 변환하는 작업
- 응답 렌더링 = 서버(파이썬)가 생성한 데이터를 클라이언트가 이해할 수 있게 변환하는 작업
이제 기존에 urls.py에서 참조하고 있던 movie_list, movie_detail 함수가 사라졌기 때문에
그거에 대한 내용을 업데이트 해줘야합니다.
# api/urls.py
from django.urls import path
from api.views import MovieListAV, MovieDetailAV
urlpatterns = [
path('list/', MovieListAV.as_view(), name='movie-list'),
path('list/<int:pk>', MovieDetailAV.as_view(), name='movie-detail'),
]
위 코드와 같이 각각의 class를 참조하도록 변경합니다.
그 이후 실행하면 이전과 똑같이 동작하는 것을 확인할 수 있습니다.
Class-based Views에서 값을 처리하는 순서
1. APIViews 클래스
APIView 클래스에서 각각의 HTTP 함수(GET, POST 등)를 오버라이드하게 합니다.
APIView 클래스로 인해 Class-based Views를 구현할 수 있게 됩니다.
2. request 인자 처리
인자로 받는 request에는 클라이언트로 받은 정보가 담겨있습니다.
예를 들면 클라이언트의 IP, 요청 함수(GET, POST 등)
또한 reqeust.data를 통해 JSON 형식의 요청 본문에 접근 가능
위 포스팅은 아래의 문서를 참조해서 만들었습니다.
https://www.django-rest-framework.org/api-guide/views/#class-based-views
'파이썬(Python) > 장고(Django)' 카테고리의 다른 글
[기초] 장고 REST API 프레임워크 - Model Serializer (0) | 2024.02.05 |
---|---|
[기초] 파이썬 장고 REST API 프레임워크 - Validation (0) | 2024.02.02 |
파이썬 Django REST API 프레임워크 CRUD 사용하기 (2) | 2024.01.31 |
파이썬 Django REST API 프레임 워크 사용하기 - 기초편 (0) | 2024.01.28 |
파이썬 Django를 사용해서 Rest API 통신 서버 만들기 - 2 (0) | 2024.01.27 |
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
댓글