django 위에 추가적으로 올라가는 framework로, django의 패러다임 하에 API를 빠르고 쉽게 만들 수 있도록 도와줍니다.
장고의 기본 클래스 기반 뷰를 바탕으로 브라우징이 가능한 편리한 API기능(Router, Authentication/Permission, Serializer, Pagination, Throttling ··· ) 들을 제공합니다.
REST API의 설계의 표준은 존재하지 않지만 설계를 위한 기본 규칙은 존재합니다.
해당 규칙을 잘 지킨 API를 RESTful 하다고 합니다.
RESTful 한 디자인의 핵심은 다음과 같이 요약할 수 있습니다. 더 자세한 내용은 Azure : RESTful web API 디자인 를 참고합니다.
- URI는 정보의 자원을 표현해야 한다.
→https://{serviceRoot}/{collection}/{id}
형식- 자원에 대한 행위는 HTTP Method (GET, PUT, DELETE, POST, HEAD, PATCH, OPTIONS) 를 지원해야 한다.
- 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
HTTP 상태코드 | 성공/실패 | 의미 |
---|---|---|
200 / OK | Success | (GET) 리소스 반환 (POST) 상태메시지 제공 또는 리소스 반환 |
201 / Created | Success | (POST) 상태 메시지 반환 또는 새로 생성된 리소스 반환 |
204 / No Content | Success | (DELETE) 성공적으로 삭제된 요청의 응답 |
400 / Bad Request | Failure | (ALL) 폼 검증 에러를 포함한 여러 메시지 반환 |
404 / Not Found | Failure | (ALL) 리소스 없음 |
라이브러리들의 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)),
]