Django Rest Framework란?
- DRF(Django Rest Framework, http://www.django-rest-framework.org)란 RESTful API 서버를 Django 안에서 쉽게 구축할 수 있도록 도와주는 오픈 소스 라이브러리이다.
- RESTful 이란?: Representational Satate Transfer 규칙을 잘 지킴
- REST 란 HTTP의 URL과 HTTP Method(GET, POST, PUT, DELETE)를 사용해서 API 사용 가독성을 높인 구조화된 시스템 아키텍쳐(Framework)이다.
- 하나의 URL로 우리는 최소 4가지의 HTTP Method를 전송할 수 있다.
- GET은 정보를 읽을 때, POST는 정보를 추가할 때, PUT은 정보를 업데이트할 때, DELETE는 정보를 삭제할때 사용하며 이를 이용하여 URI를 설계한다.
초기세팅하기
(1). 프로젝트를 관리 할 빈 폴더를 생성한다.
(2). 생성한 폴더에서 가상환경을 생성하고 실행한다.
*가상환경 실행시 만들어진 디렉터리내에서 실행한다.
python -m venv [가상환경 이름]
#windows
[가상환경 이름]/scripts/activate.bat 실행
#mac
source [가상환경 이름]/bin/activate
#가상환경 비활성화
/deactivate
(3). 필요한 패키지 설치하기
pip install django
pip install djangorestframework
(4). Djnago proejct 생성하기 & Django app 생성하기
*가상환경 디렉터리에서 빠져나온 후 진행한다.
# django-admin startproject [프로젝트이름] .
django-admin startproject mydjango .
# python manage.py startapp [앱이름]
python manage.py startapp api
(5). project생성 & app 생성 후 디렉터리 구조
settings.py 설정하기
- mydjango 프로젝트의 settings.py에 들어가 필요한 부분을 설정을 해준다.
- settings.py에 추가 및 변경
ALLOWED_HOSTS = ["*"]
# 생성한 api앱과 rest_framework를 추가해준다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'api',
'rest_framework'
]
#언어를 한국어로 변경해준다.
LANGUAGE_CODE = 'ko'
#시간
TIME_ZONE = 'Asia/Seoul'
2. 서버 실행
*mange.py가 있는 디렉터리에서 작업
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
*runserver후 로컬주소를 통해 들어가본다.
* 추가설명
- makemigrations : 모델 변경사항 감지 및 기록
- migrate : 변경사항을 DB에 적용 (Django는 dbsqlite3 를 기본 db로 제공한다)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
위와 같은 페이지가 나오면 정상작동하는 것이다. 이제 장고를 사용할 가장 기초적인 준비가 끝났다.
REST API MODEL 만들기
1. Models.py
- 만들어놓은 api app의 models.py에 들어가 model을 작성한다.
- django에서 Model은 데이터 서비스를 제공하는 하나의 layer이다. django에서 생성되는 app의 models.py에 의해 정의 할 수 있다. 쉽게 말해 models.py에서 모델 클래스를 설정하면 데이터베이스에 테이블이 생성되는 것이다.
- api에서 사용할 모델 클래스를 만들어준다.
from django.db import models
# Create your models here.
class Item(models.Model):
name = models.CharField(max_length=100)
description = models.TextField(max_length=300)
cost = models.IntegerField()
- 모델의 필드 타입 & 옵션
- model의 필에는 다양한 타입과 그에따른 옵션이있다. 참고해서 사용해보자
Field Type설명 💻
CharField | 제한된 문자열 필드 타입. 최대 길이를 max_length 옵션에 지정해야 한다. 문자열의 특별한 용도에 따라 CharField의 파생클래스로서, 이메일 주소를 체크를 하는 EmailField, IP 주소를 체크를 하는 GenericIPAddressField, 콤마로 정수를 분리한 CommaSeparatedIntegerField, 특정 폴더의 파일 패스를 표현하는 FilePathField, URL을 표현하는 URLField 등이 있다. |
TextField | 대용량 문자열을 갖는 필드 |
IntegerField | 32 비트 정수형 필드. 정수 사이즈에 따라 BigIntegerField, SmallIntegerField 을 사용할 수도 있다. |
BooleanField | true/false 필드. Null 을 허용하기 위해서는 NullBooleanField를 사용한다. |
DateTimeField | 날짜와 시간을 갖는 필드. 날짜만 가질 경우는 DateField, 시간만 가질 경우는 TimeField를 사용한다. |
DecimalField | 소숫점을 갖는 decimal 필드 |
BinaryField | 바이너리 데이타를 저장하는 필드 |
FileField | 파일 업로드 필드 |
ImageField | FileField의 파생클래스로서 이미지 파일인지 체크한다. |
UUIDField | GUID (UUID)를 저장하는 필드 |
필드 옵션설명 💻
null (Field.null) | null=True 이면, Empty 값을 DB에 NULL로 저장한다. DB에서 Null이 허용된다. 예: models.IntegerField(null=True) |
blank (Field.blank) | blank=False 이면, 필드가 Required 필드이다. blank=True 이면, Optional 필드이다. 예: models.DateTimeField(blank=True) |
primary_key (Field.primary_key) | 해당 필드가 Primary Key임을 표시한다. 예: models.CharField(max_length=10, primary_key=True) |
unique (Field.unique) | 해당 필드가 테이블에서 Unique함을 표시한다. 해당 컬럼에 대해 Unique Index를 생성한다. 예: models.IntegerField(unique=True) |
default (Field.default) | 필드의 디폴트값을 지정한다. 예: models.CharField(max_length=2, default="WA") |
db_column (Field.db_column) | 컬럼명은 디폴트로 필드명을 사용하는데, 만약 다르게 쓸 경우 지정한다. |
2. Serializer 생성
- 만들어 놓은 앱 폴더 내에 serializers.py를 생성해준다.
- serialiezer란 장고 모델 데이터를 json타입으로 바꿔주는 작업을 해준다. 즉 직렬화 작업을 해준다.
- 장고 모델 데이터를 json으로 바꿔주면 api 통신을 할 때 훨씬 편하게 작업할 수 있다.
- app 폴더 내에 serializers.py를 만든다.
- 설치한 rest_framework에서 serializers를 import한다.
- 설정한 models.py의 Item class를 import한다.
from rest_framework import serializers
from .models import Item
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = ("__all__")
#fields = ('name', 'description', 'cost')
3. Viewset 생성
- 만들어 놓은 앱 폴더 내에 views.py에 작성한다.
- ModelViewSet은 기본적으로 CRUD를 지원한다.
- 모델명.objects.all() : 해당 모델에 존재하는 테이블의 데이터를 전부 갖고 오겠다는 뜻이다.
- serializer_class: 위에서 생성한 ItemSerializer를 사용하겠다는 뜻이다.
from django.shortcuts import render
from rest_framework import viewsets
from .serializers import ItemSerializer
from .models import Item
# Create your views here.
class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
- Viewset 장점
- queryset 사용으로 반복되는 CRUD 로직을 한번에 정의할 수 있음
- Router를 사용함으로써, URL설정을 다룰 필요가 없음
4. Router 등록
- 만들어 놓은 앱 폴더 내에 urls.py를 생성한다. #api/urls.py
from django.urls import include, path
from rest_framework import routers
from . import views #views.py import
router = routers.DefaultRouter() #DefaultRouter를 설정
router.register('Item', views.ItemViewSet) #itemviewset 과 item이라는 router 등록
urlpatterns = [
path('', include(router.urls))
]
-만들어 놓은 프로젝트 폴더내에 urls.py를 설정해준다. #mydjango/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('api.urls')), #api/urls.py 를 사용
]
REST API 테스트
- 위에서 Models.py를 설정하고 migrate를 해주지 않은 상태이기 때문에 db에 테이블이 형성되지 않은 상태이다.
- 아래 명령어 순서대로 다시 migrate 해준 후 runserver해주자
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
주소 클릭 (GET)
POST
DELETE
PUT
간단한게 REST API를 테스트 해보았다.
댓글