최근 회사 내 스터디를 통해 Django Rest Framework를 사용하게 되었는데 아무것도 모르는 상태에서 무작정
로직을 구현하려 하니 복잡한 게 이만저만이 아니었다 그래서 이참에 DRF에 관해서 공부를 해보기로 했다.
DRF
Django 안에서 Restful API 서버를 쉽게 구축할 수 있도록 도와주는 오픈소스 라이브러리
(REST: HTTP의 URL과 HTTP method를 사용하여 API 사용 가독성을 높인 구조화된 시스템 아키텍처)
Rest API 흐름
1. Model 만들기
일반적으로 우리가 Django에서 모델을 정의하는 것처럼 만들면 된다.
---------
여러가지 import 내용들
---------
class 모델명(models.Model):
... 모델 정의
def __str__(self):
return self.원하는 필드
이런 느낌이다.
2. Serializer 만들기
'직렬화'는 말 그대로 models에 작성한 폼 그대로 JSON 형태로 linear 하게 보여주는 것이다.
Serializer는 queryset과 모델 인스턴스와 같이 복잡한 데이터를 JSON, XML 또는 다른 콘텐츠 유형으로 변환할 수 있고,
Serializer는 받은 데이터의 유효성 검사를 진행한 뒤 복잡한 타입으로의 형 변환을 할 수 있도록 Serialization을 제공한다.
- 직렬화: 추상적인 object를 구체적이고, 저장 가능하고, 전송 가능한 텍스트 파일로 바꿔주는 것
- 역직렬화: 텍스트 파일을 직렬화된 데이터 포맷 형태로 추상적인 object 데이터로 바꿔주는 것
- 데이터를 직렬화하고 역직렬화 하려면, 데이터 포맷을 알고 있어야 한다. JSON, XML, YAML과 같은
문서 포맷이 주로 직렬화의 대상이 된다.
직렬화를 하는 이유
object는 메모리에 존재하고, 추상적인데 비해 String or bytes 데이터는 드라이브에 저장할 수 있고
통신선으로 전송도 가능하기 때문이다.
class SubCategorySerializer(serializers.ModelSerializer):
class Meta:
model = SubCategory
fields = [
'id',
'title',
'main_category'
]
def to_representation(self, instance):
self.fields['main_category'] = MainCategorySerializer(read_only=True)
return super(SubCategorySerializer, self).to_representation(instance)
3. view 만들기
Viewset을 사용하면 보다 편리하게 View를 구성할 수 있다.
Viewset이란 View들의 집합으로 DRF에서 여러 가지 API를 통합하여 하나의 Set으로 제공하는 것이다.
과거 CBV 방식으로 view를 구성하려면 함수 정의를 통해 Get, Post 함수를 직접 정의해줘야 했다.
하지만 Viewset은 여러 내용들을 상속받아 함수를 따로 만들지 않아도 된다.
ViewSet에도 종류가 있다!
GenericViewSet: 기본적인 종류만 제공 (get_object, get_queryset 등)
=> 요 녀석은 사용할 때, mixin을 오버라이딩 하거나 명시적으로 함수를 정의해줘야 한다.
ModelViewSet: action이 제공된다. (.list(), .retrieve(), .create(), .update())
ReadOnlyModelViewSet: read-only인 action이 제공된다. (.list(), .retireve())
from .models import Comment
from .serializer import CommentSerializer
from rest_framework import viewsets
from rest_framework.authentication import SessionAuthentication, BasicAuthentication, TokenAuthentication
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from ..post.permissions import IsOwnerOrReadOnly
class CommentViewSet(viewsets.ModelViewSet):
# authentication_classes = [TokenAuthentication, SessionAuthentication]
permission_classes = [IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
queryset = Comment.objects.all()
serializer_class = CommentSerializer
def perform_create(self, serializer):
serializer.save(user = self.request.user)
위와 같이 작성해주면 알아서 get, post, update, delete를 생성해준다.
4. url 만들기
ViewSet을 Router에 연결하면 url을 자동으로 맵핑해준다.
from django.urls import path, include
from .views import CommentViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('comment', CommentViewSet)
urlpatterns = [
path('', include(router.urls))
]
위와 같이 작성해주면 간단하게 맵핑할 수 있다.
좀 더 자세히 파고들자면 ViewSet과 URL도 세분화하여 정밀하게 지정할 수 있고, Serializer도 세부적으로 메소드를
나누어 로직을 추가할 수 있지만 이번 포스팅에서는 DRF가 어떤 녀석이고 어떤 흐름으로 동작하는지에 관해서만
알아두고 넘어가도록 한다.
'Python > Django' 카테고리의 다른 글
Django Rest_framework 게시판 만들기 (0) | 2022.03.15 |
---|---|
Django + PostgreSQL CRUD 만들기 (0) | 2022.02.23 |
Django와 PostgreSQL 연동 (1) | 2022.02.23 |