터칭 데이터

장고(Django) 클래스(Class) 기반의 뷰(Views) 본문

장고 (Django)

장고(Django) 클래스(Class) 기반의 뷰(Views)

터칭 데이터 2023. 11. 4. 19:59

 

 

 

더 깔끔하고 쉬운 Django Class-Based Views

 

우리는 지금까지 뷰(polls_api/views.py)를 메서드 기반으로 작성해왔는데요

 

이를 클래스 기반의 뷰로 작성할 수 있습니다.

 

polls_api/views.py

from django.shortcuts import render, get_object_or_404
# from rest_framework.decorators import api_view
from polls.models import Question
from .serializers import QuestionSerializer
from rest_framework.response import Response
from rest_framework import status
from rest_framework.views import APIView
# Create your views here.

class QuestionList(APIView):
    def get(self, request):
        questions = Question.objects.all()
        serializer = QuestionSerializer(questions, many = True)
        return Response(serializer.data)
    
    def post(self, request):
        serializer = QuestionSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class QuestionDetail(APIView):
    def get(self, request, id):
        question = get_object_or_404(Question, pk=id)
        serializer = QuestionSerializer(question)
        return Response(serializer.data)
    
    def put(self, request, id):
        question = get_object_or_404(Question, pk=id)
        serializer = QuestionSerializer(question, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    def delete(self, request, id):
        question = get_object_or_404(Question, pk=id)
        question.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

 

기존의 api_view 데코레이터의 도움을 받아 메서드내에서 분기를 따르는 방식 대신에

 

class 모델명+기능명으로 알기 쉬운 이름으로 클래스를 작성하는데 이때 rest_framework.views에서 APIView를 import해 상속받습니다.

 

 

 

 

 

 

urls.py 수정

 

 

뷰(views.py)의 메서드가 사라졌으니 urls.py도 수정을 해줘야 합니다.

 

 

방법은 간단합니다. 위와 같이 views에서 클래스 기반 뷰의 클래스들을 가져오고 뒤에 as_view()를 붙여줍니다.

 

간단히 설명하면 as_view()는 기반 클래스들의 함수 get, post, put, delete 등을 알아서 판단해주는 도우미입니다.

 

자세한 설명은 아래와 같습니다.

 

Django Class-Based Views에서 `as_view()` 메서드는 클래스를 뷰 함수로 변환하는 역할을 합니다. 클래스 기반 뷰를 URL 패턴과 연결할 때, `as_view()`를 사용하여 클래스를 뷰 함수로 변환하고 호출 가능한 형태로 만듭니다. 이 메서드의 주요 역할은 다음과 같습니다:

1. **클래스 인스턴스화**: `as_view()` 메서드를 호출하면 해당 클래스의 인스턴스가 생성됩니다. 이 인스턴스는 뷰 함수로 사용됩니다.

2. **HTTP 메서드 지원**: 클래스 기반 뷰 클래스는 HTTP 메서드(GET, POST, PUT, DELETE 등)에 대한 메서드를 구현합니다. 예를 들어, `get()` 메서드는 GET 요청을 처리하고, `post()` 메서드는 POST 요청을 처리합니다. `as_view()`는 요청의 HTTP 메서드에 따라 적절한 클래스 메서드를 호출합니다.

3. **요청 및 응답 처리**: `as_view()` 메서드를 통해 생성된 클래스 인스턴스는 실제 요청(request)을 받아 처리하고, 응답(response)을 반환합니다. 이렇게 생성된 인스턴스는 URL 패턴에서 사용될 때 URL의 경로 변수를 받아서 처리하거나, 요청과 관련된 데이터를 처리하는 데 사용됩니다.

예를 들어, 다음은 클래스 기반 뷰를 `as_view()`를 사용하여 URL 패턴과 연결하는 예입니다:

from django.urls import path
from .views import MyView

urlpatterns = [
    path('my-view/', MyView.as_view(), name='my-view'),
]



`MyView` 클래스는 클래스 기반 뷰이며, `as_view()`를 사용하여 URL 패턴과 연결됩니다. 이를 통해 해당 URL에서 클래스의 `get()` 또는 `post()` 메서드가 적절한 HTTP 메서드에 따라 호출되어 요청을 처리하게 됩니다.

 

 

 

 

브라우저에서 새로고침후 메서드 기반 뷰 때와 마찬가지로 정상 작동하는지 확인해주세요.

 

 

 
 

'장고 (Django)' 카테고리의 다른 글

장고(Django) Generic API View  (0) 2023.11.04
장고(Django) 믹스인(Mixin)  (0) 2023.11.04
장고(Django) PUT/DELETE  (0) 2023.11.04
장고(Django) POST  (0) 2023.11.04
장고(Django) GET  (0) 2023.11.04