Class
๋ฅผ ์ด์ฉํด View
๋ฅผ ์ค๊ณํ๋ฉด ์ข์์
- Reuse common functionally
- ๋ถํ์ํ ์ฝ๋๋ฅผ ์ ๊ฑฐํด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์
์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๋ ์ด์
Class
์๋ง ์๋ ์์์ ๊ฐ๋
APIView
๋ฅผ ์์ํด์ View
๋ฅผ ์ค๊ณํ ๋๋
status
์ Response
๋ฅผ import
ํด์ Response ๊ณผ์ ์ ์์ฑํ๋ค.
APIView
๋ฅผ ์์ํด์ ๋ง๋ CBV์ ๋ด๋ถ ํจ์๋ค์
ํ์๋ก ํ๋ HTTP Method
๋ฅผ ์ด๋ฆ์ผ๋ก ๊ฐ๋๋ค.
SnippetDetail
ํด๋์ค์์ ํ์ํ Method
๋ GET
, PUT
, DELETE
๋ค.
class SnippetDetail(APIView):
def get(...):
...
def put(...):
...
def delete(...):
...
์ด๋ ํ status
๋ฅผ ๋ฐ๊ณ Response
๋ฅผ ์ ๋ฌํ ์ง ์ง์ ์ ํ๋ ๊ฒ์ด
APIView
๋ฅผ ์์๋ฐ์ CBV์ ์์๋ค.
django-admin startproject <project-name>
cd <project-name>
python manage.py startapp <app-name>
settings.py
์ App,rest_framework
์ถ๊ฐmodels.py
์ ๋ชจ๋ธ ์์ฑ ๋ฐmigrate
class Post(models.Model):
title = models.CharField(max_length=100)
body = models.TextField()
serializer.py
์์ฑ ๋ฐ ์์ฑ
from .models import Post
from rest_framework import serializers
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = "__all__"
APIView
๋ฅผ ์์๋ฐ์ CBV๋ฅผ ์์ฑํ๊ธฐ ์ํด ์๋์ ๋ชจ๋์ ์ถ๊ฐํ๋ค.
from CBV.models import Post
from CBV.serializer import PostSerializer
from django.http import Http404
from rest_framework.response import Response
from rest_framework import status
from rest_framework.views import APIView
GET
๋งค์๋๋ ๋ค์์ Post
๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ค.
๋ค์์ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ๊ธฐ ์ํด์ PostSerializer
์ many=True
๋ฅผ ๋๊ฒจ์ค์ผ ํ๋ค.
POST
๋ฉ์๋๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํจ์๋ค.
์์ฒญ์ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํ ํ is_valid
ํจ์๋ก ์ ํจ์ฑ ๊ฒ์ฌ ํ ์ ์ฅ
์ ์ฅ ์ฑ๊ณต ์ ์ํ์ฝ๋ 201(CREATED)
๋ฐํ ์คํจ์ 400(BAD REQUEST)
๋ฐํ
class PostList(APIView):
def get(self, request):
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
return Response(serializer.data)
def post(self, request):
serializer = PostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
PostList
ํด๋์ค์ ๋ค๋ฅด๊ฒ ๊ฐ๊ฐ์ ํจ์์ pk
๊ฐ์ ์ธ์๋ก ๋ฐ๋๋ค.
get_object
ํจ์๋ get_object_or_404
ํจ์์ ๋์ผํ ๊ธฐ๋ฅ์ ํ๋ค.
PostList
์์ ์์ฑํ ํจ์๋ค๊ณผ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค.
class PostDetail(APIView):
def get_object(self, pk):
try:
return Post.objects.get(pk=pk)
except Post.DoesNotExist:
return Http404
def get(self, request, pk, format=None):
post = self.get_object(pk)
serializer = PostSerializer(post)
return Response(serializer.data)
def put(self, request, pk, format=None):
post = self.get_object(pk)
serializer = PostSerializer(post, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
post = self.get_object(pk)
post.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
- App๋ด๋ถ์
urls.py
rest_framework.urlpatterns
์ format_suffix_patterns
๋ชจ๋์ ์ถ๊ฐํ๊ณ
views.py
๋ฅผ ๊ฐ์ ธ์ <ClassName>.as_view()
ํ์์ผ๋ก ์์ฑํ๋ค.
from django.urls import path, include
from rest_framework.urlpatterns import format_suffix_patterns
from . import views
urlpatterns = [
path("post", views.PostList.as_view()),
path("post/<int:pk>", views.PostDetail.as_view()),
]
urlpatterns = format_suffix_patterns(urlpatterns)
- ํ๋ก์ ํธ ํด๋์
urls.py
include
๋ฅผ ์ฌ์ฉํด ์ฑ์ url.py
๋ฅผ ๊ฐ์ ธ์ PATH์ค์
from django.contrib import admin
from django.urls import path, include
import CBV.urls
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(CBV.urls)),
]
http://127.0.0.1:8000/
์ ์ ์ํด๋ณด์.
์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
PATH๊ฐ " "
์ธ url
์ ์ค๊ณํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
http://127.0.0.1:8000/post
๋ก ์ ์ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ์ ๋ณด์ฌ์ง๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
PostList
ํด๋์คGET
๋งค์๋ ํ ์คํธ
PostList
ํด๋์คPOST
๋งค์๋ ํ ์คํธ
PostList
ํด๋์คGET
๋งค์๋ ํ ์คํธ
PostDetail
ํด๋์คGET
๋งค์๋ ํ ์คํธ
PostDetail
ํด๋์คPUT
๋งค์๋ ํ ์คํธ
PostDetail
ํด๋์คDELETE
๋งค์๋ ํ ์คํธ