본문 바로가기
파이썬(Python)/장고(Django)

[기초] 파이썬 장고 REST API 프레임 워크 - Class-based Views

by 기계공학 주인장 2024. 2. 1.
반응형

이전 포스팅에서 기본적인 장고 REST API 프레임 워크의 셋업 방법과 간단한 사용 방법에 대해 알려드렸습니다.

 

https://android-developer.tistory.com/80

 

파이썬 Django REST API 프레임 워크 사용하기 - 기초편

이전 포스팅에서는 파이썬의 Django을 설치하는 방법과 기본적인 원리를 설명했습니다. 이번 포스팅에서도 이어서 하기 때문에 아래의 포스팅을 먼저 보는 것을 추천합니다. 파이썬 Django를 사용

android-developer.tistory.com

 

https://android-developer.tistory.com/81

 

파이썬 Django REST API 프레임워크 CRUD 사용하기

이전 포스팅에서 Django REST API 프레임워크의 설치 방법 및 간단한 셋업 방법에 대해 알아봤습니다. https://android-developer.tistory.com/80 파이썬 Django REST API 프레임 워크 사용하기 - 기초편 이전 포스팅

android-developer.tistory.com

 

지금까지는 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

 

Views - Django REST framework

 

www.django-rest-framework.org

 

반응형


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


댓글