터칭 데이터
장고(Django) 클래스(Class) 기반의 뷰(Views) 본문
더 깔끔하고 쉬운 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 |