(DRF) REST API

duo2208·2022년 1월 19일
1

Django

목록 보기
12/23
post-thumbnail
post-custom-banner

django-rest-framework


django 위에 추가적으로 올라가는 framework로, django의 패러다임 하에 API를 빠르고 쉽게 만들 수 있도록 도와줍니다.

장고의 기본 클래스 기반 뷰를 바탕으로 브라우징이 가능한 편리한 API기능(Router, Authentication/Permission, Serializer, Pagination, Throttling ··· ) 들을 제공합니다.

REST API 디자인


REST API의 설계의 표준은 존재하지 않지만 설계를 위한 기본 규칙은 존재합니다.
해당 규칙을 잘 지킨 API를 RESTful 하다고 합니다.

RESTful 한 디자인의 핵심은 다음과 같이 요약할 수 있습니다. 더 자세한 내용은 Azure : RESTful web API 디자인 를 참고합니다.

  1. URI는 정보의 자원을 표현해야 한다.
    https://{serviceRoot}/{collection}/{id} 형식
  2. 자원에 대한 행위는 HTTP Method (GET, PUT, DELETE, POST, HEAD, PATCH, OPTIONS) 를 지원해야 한다.
  3. API 버저닝은 Major.minor로 하고, URI에 버전정보를 포함시킨다.

+ 다음을 덧붙입니다.

  • 동사가 아닌 명사를 기반으로 한다.
https://adventure-works.com/orders       // Good
https://adventure-works.com/create-order // Avoid
  • 단수 명사가 아닌 복수 명사를 활용한다.
https://adventure-works.com/users       // Good
https://adventure-works.com/user	// Avoid
  • ? 를 활용한다.
https://adventure-works.com/movies?status=now-showing	// Good
https://adventure-works.com/movies/now-showing		// Avoid
  • 슬래시 구분자를 통해 계층 관계를 나타낸다
  • 마지막에는 슬래시 구분자를 포함하지 않는다.
  • 언더바 보다는 하이픈을 사용한다.
  • URI는 소문자로 표기한다.
  • URI에 파일 확장자를 표기하지 않는다.

HTTP 상태코드성공/실패의미
200 / OKSuccess(GET) 리소스 반환 (POST) 상태메시지 제공 또는 리소스 반환
201 / CreatedSuccess(POST) 상태 메시지 반환 또는 새로 생성된 리소스 반환
204 / No ContentSuccess(DELETE) 성공적으로 삭제된 요청의 응답
400 / Bad RequestFailure(ALL) 폼 검증 에러를 포함한 여러 메시지 반환
404 / Not FoundFailure(ALL) 리소스 없음

간단한 JSON API 샘플


라이브러리들의 HTTP 요청을 통한 CRUD를 처리 하는 간단한 샘플을 구현합니다.

설치

$ pip install djangorestframework

앱생성

$ python manage.py startapp myapp

Settings

# settings.py
INSTALLED_APPS = [
	...
 	'rest_framework',   
	'myapp',
]

Models

# myapp/models.py
from django.db import models

class Post(models.Model):
	message = models.TextField()

Serializers
모든 프로그래밍 언어의 통신에서 데이터는 필히 문자열로 표현되어야 합니다.

Serializers는 models 객체와 querysets 같은 복잡한 데이터를 JSON, XML과 같은 직렬화 포맷으로 직렬화 시켜줍니다.

# myapp/serializers.py
from rest_framework import serializers
from .models import Post

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

Views
여러 개의 view를 작성하지 않고, 공통적인 행위들을 ViewSet에 하나로 그룹화하여 간결하게 사용할 수 있습니다.

# myapp/views.py
from django.shortcuts import render
from instagram.serializers import PostSerializer
from rest_framework.viewsets import ModelViewSet
from .models import Post

class PostViewSet(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

URLs
views에서 작성한 ViewSet을 Router에 연결하면 url을 자동으로 맵핑해주기 때문에 편리하게 이용할 수 있습니다.

# myapp/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from . import views

router = DefaultRouter()
router.register('post', views.PostViewSet) 

urlpatterns = [
    path('', include(router.urls)),
]

📌 참고 출처

post-custom-banner

0개의 댓글