Skip to content

Latest commit

ย 

History

History
222 lines (148 loc) ยท 6.2 KB

File metadata and controls

222 lines (148 loc) ยท 6.2 KB

3์ฃผ์ฐจ - 2. APIView

Class Based View

Class๋ฅผ ์ด์šฉํ•ด View๋ฅผ ์„ค๊ณ„ํ•˜๋ฉด ์ข‹์€์ 

  • Reuse common functionally
  • ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ž„

์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง€๋Š” ์ด์œ 

  • Class์—๋งŒ ์žˆ๋Š” ์ƒ์†์˜ ๊ฐœ๋…

APIView๋ฅผ ์ƒ์†๋ฐ›์€ CBV

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์˜ ์˜์˜๋‹ค.

์ง์ ‘ ์ž‘์„ฑํ•ด๋ณด๊ธฐ

1. ์ด์ „์˜ ๊ณผ์ • ๋™์ผํ•˜๊ฒŒ ์ง„ํ–‰

  1. django-admin startproject <project-name>
  2. cd <project-name>
  3. python manage.py startapp <app-name>
  4. settings.py์— App, rest_framework์ถ”๊ฐ€
  5. models.py์— ๋ชจ๋ธ ์ž‘์„ฑ ๋ฐ migrate
class Post(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
  1. serializer.py์ƒ์„ฑ ๋ฐ ์ž‘์„ฑ
from .models import Post
from rest_framework import serializers


class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = "__all__"

2. views.py ์ž‘์„ฑํ•˜๊ธฐ

1) ํ•„์š”ํ•œ ๋ชจ๋“ˆ ์ถ”๊ฐ€

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
2) ๊ฐ์ฒด๋“ค์˜ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋Š” PostList ์ž‘์„ฑ

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)
3) ๊ฐ์ฒด์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋ฐ›๋Š” PostDetail ์ž‘์„ฑ

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)

3. urls.py ์ž‘์„ฑํ•˜๊ธฐ

  • 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๋กœ ์ ‘์†ํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์ž˜ ๋ณด์—ฌ์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


httpie๋กœ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ

  • PostListํด๋ž˜์Šค GET๋งค์„œ๋“œ ํ…Œ์ŠคํŠธ


  • PostListํด๋ž˜์Šค POST๋งค์„œ๋“œ ํ…Œ์ŠคํŠธ


  • PostListํด๋ž˜์Šค GET๋งค์„œ๋“œ ํ…Œ์ŠคํŠธ


  • PostDetailํด๋ž˜์Šค GET๋งค์„œ๋“œ ํ…Œ์ŠคํŠธ


  • PostDetailํด๋ž˜์Šค PUT๋งค์„œ๋“œ ํ…Œ์ŠคํŠธ


  • PostDetailํด๋ž˜์Šค DELETE๋งค์„œ๋“œ ํ…Œ์ŠคํŠธ