안녕세계

[장고 AtoZ] Django REST Framework - FBV(@api_view) 본문

[장고 AtoZ] Django REST Framework - FBV(@api_view)

Junhong Kim 2018. 2. 8. 11:29
728x90
반응형

안녕하세요 이번 포스팅에서는 DRF로 FBV만들기를 진행해보겠습니다.

지금까지 viewSet을 활용한 CRUD, CBV를 활용한 CRUD를 만들어보았는데

이번 포스팅은 지난 포스팅보다 더 쉬우니 잘 따라하실 수 있을거라 생각합니다 :D


이번에는 comment App을 생성하고 comment의 CRUD를 FBV로 만들어보겠습니다.

 $ django-admin startapp comment

그다음 이제 장고 프로젝트에 comment를 추가해줍시다!



[tutorial/settings/base.py]

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'blog',
'post',
'comment',
]



다음으로는 어떤 걸 해야할까요?

urls.py와 serializers.py 파일을 생성하고, model을 만들어줍시다!



[comment/models.py]

model을 만들어주고,

from django.db import models


class Comment(models.Model):
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)


[comment/serializers.py]

serializers를 만들어줍시다.

from rest_framework import serializers
from .models import Comment


class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = '__all__'

이제 여기까지의 과정은 매우 익숙하죠?

viewSet이나 CBV나 FBV나 여기까지 과정은 동일합니다.

중간에 잠깐 정리하고 가면


[ App 생성 => urls.py / serializers.py 생성 => model / serializers 작성 ]

(그리고 뒤에서는 url 맵핑을 해주면 됩니다 :D)


위 과정을 모두 마치셨다면 이제 FBV를 만들어 봅시다!

FBV를 만들기위해서는 @api_view 데코레이터를 사용해야합니다.



[comment/views.py]

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response

from .models import Comment
from .serializers import CommentSerializer


@api_view(['GET', 'POST'])
def comment_list(request):
# 댓글 조회
if request.method == 'GET':
queryset = Comment.objects.all()
serializer = CommentSerializer(queryset, many=True)
return Response(serializer.data)

# 댓글 생성
elif request.method == 'POST':
serializer = CommentSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATE)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET', 'PUT', 'DELETE'])
def comment_detail(request, pk):
try:
comment = Comment.objects.get(pk=pk)
except Comment.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)

# 특정 댓글 조회
if request.method == 'GET':
serializer = CommentSerializer(comment)
return Response(serializer.data)

# 특정 댓글 수정
elif request.method == 'PUT':
serializer = CommentSerializer(comment, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

# 특정 댓글 삭제
elif request.method == 'DELETE':
comment.delete()
return Response(status=status.HTTP_204_NO_CONTENT)

CBV 와 동일하지만 클래스 기반이 아닌 함수기반이라는 것을 알아두셔야 합니다.

클래스기반 뷰에서는 요청을 함수로 정의했지만 FBV에서는 어노테이션에 명시하고

request.method를 통해서 요청을 처리해줘야합니다.


@api_view()는 함수 기반 뷰를 만들겠다는 장식자이며 이 안에 요청 메서드를 명시합니다.

그러면 해당 뷰로 요청이 들어왔을 때 request가 method를 구분하여 우리가 원하는 구문을 실행합니다.

안쪽 내용은 CBV와 동일하기 때문에 생략하겠습니다.

여기까지 뷰를 만들었다면 우리가 만든 comment model에 대한 테이블을 생성해줍시다.


 $ python manage.py makemigrations --settings=tutorial.settings.local


 $ python manage.py migrate --settings=tutorial.settings.local




이제 그럼 우리가 만듬 함수기반뷰를 맵핑합시다

from django.urls import path
from . import views

urlpatterns = [
path('', views.comment_list),
path('<int:pk>/', views.comment_detail),
]

CBV와 다른점이라면 views에 함수를 직접 대입했다는 점이죠!



[tutorial/urls.py]

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
path('post/', include('post.urls')),
path('comment/', include('comment.urls')),
]

물론 장고 프로젝트 url에도 추가하는것을 잊지 말아주세요 ㅎㅎ


자.. 그럼 테스트를 해봅시다!


GET /comment/

아직 데이터가 없기때문에 빈 배열이 넘어오는것이 맞습니다!



POST /comment/

댓글 데이터 두개를 생성해봅시다!


GET /comment/

다시 조회를 해보니, 우리가 만든 두 데이터가 잘 보입니다!


PUT /comment/1/

데이터를 수정해보기도 하고,


DELETE /comment/2/

데이터를 삭제해봅시다!


GET /comment/

다시 댓글 목록을 조회하면?

1번 댓글은 수정되었고, 2번 댓글은 삭제된것을 확인할 수 있습니다.


자, 지금까지 FBV에 대한 구현과 실습이였습니다 :D

CBV와 다른점이 느껴지시나요?


지금까지 포스팅에서

viewSet - CBV - FBV 순으로 알아보았습니다.


자유도 측면에서는 FBV가 가장 자유도가 높으며,  viewSet은 쉽고 빠르게 API 를 만들수 잇고

CBV는 재사용성에 초점을 맞춰 개발할 수 있습니다.


세가지 방법은 모두 동일한 작업을 진행할 수 있습니다.

또한 위 세가지 이 외에 mixin과 generics로도 API를 만들 수 있습니다.


즉 DRF를 활용하여 API를 만드는 방법이 무려 다섯가지가 있다는것이죠.

간략하게 정리를 하자면


APIView(CBV) & api_view(FBV) => mixin => generics => viewSet


요렇게 5가지의 방법이있으며 오른쪽으로 갈수록 점점 코드를 간략하게 API를 만들 수 있다는 장점이 있지만,

가장 유연한 API를 만들때는 APIView나 api_view를 사용해서 만들 수 있습니다.


그러므로 여러분의 프로젝트 상황에 따라서 적절히 조합하여 사용하시면 좋을것 같습니다!

여기까지가 Django REST Framework로 활용하여 API를 만드는 방법을 배워봤으며

다음 포스팅에서는 우리가 이전에 가볍게 지나갔던 

model과 serializer에 대해 조금 더 깊히 알아보고,


sqlite가 아닌 MySQL 데이터베이스와 연동하는 과정을 진행해보도록 하겠습니다.

감사합니다!!

728x90
반응형
Comments