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를 설계한다.
기본적으로 pseudo code의 경우 터미널에서 진행됩니다.
(1) 우선 프로젝트를 넣을 빈 폴더를 생성하여 준다.
$ mkdir [프로젝트 폴더 이름]
(2) 가상환경을 생성하고 실행시킨다.
$ python3 -m venv [가상환경 이름]
$ source [가상환경 이름]/bin/activate
$ deactivate # 가상환경 종료
(3) 패키지 설치하기 with pip
$ pip install django
$ pip install djangorestframework
(4) Django project 생성하기
$ django-admin startproject [프로젝트 이름] .
(5) Django app 생성하기
$ python3 manage.py startapp [앱 이름]
코드 에디터(여기서는 vscode로 함)를 켜고 프로젝트와 앱이 잘 생성되었는지 확인한다.
위와 같이 잘 생성되었다면, project 폴더인 fearnot
에 들어가서 settings.py
를 확인하자.
그리고 아래와 같이 수정해준다.
import os
ALLOWED_HOSTS = ["*"]
...
TIME_ZONE = 'Asia/Seoul'
...
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # 정적 파일 관리에 대한 코드
그 이후 INSTALLED_APPS
에 app
과 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',
]
그리고 terminal
에서 장고 서버가 제대로 돌아가는지 실행하여보자
$ python3 manage.py makemigrations
$ python3 manage.py migrate
$ python3 manage.py runserver
api app에 있는 models.py
에 들어간다. (여기서 app name은 api로 만들었다.)
그리고 원하는 입맛에 맞춰 model을 작성한다.
from django.db import models
# Create your models here.
class Calc(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
rate = models.FloatField()
count = models.IntegerField()
여기서 Serializer 란?
- 장고 모델 데이터를 JSON 타입으로 바꿔주는 작업을 해준다.
- 이를 직렬화라고 한다.
- 장고 모델 데이터를 템플릿에 뿌려주면 웹에 보여지듯, JSON 타입으로 뿌려주면 api로 통신이 되는 것이다.
- 장고 모델 데이터를 JSON 타입으로 바꿔주는 기계라고 이해하자.
serializers.py
를 만든다.fields
내용을 포함한 JSON 데이터로 변환해주는 Serializer가 완성된다.from rest_framework import serializers
from .models import Calc
class CalcSerializer(serializers.ModelSerializer):
class Meta:
model = Calc
fields = ('title', 'body', 'rate', 'count')
HelloAPI
함수부터 만들어보자.from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import Calc
from .serializers import CalcSerializer
# Create your views here.
@api_view(['GET'])
def HelloAPI(request):
return Response("Hello API!")
urls.py
를 생성해서 url path를 만들어주고, view와 연결하여 준다.프로젝트 폴더 내의 urls.py와 앱 폴더 내의 urls.py는 어떤 점이 다를까?
- app 내의 urls.py는 app에 대한 url을 관리한다.
- 프로젝트 폴더 내의 urls.py는 전체 프로젝트에 대한 url을 관리한다.
from django.urls import path, include
from .views import helloAPI
urlpatterns = [
path("hello/", helloAPI),
]
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
]
http://127.0.0.1:8000/api/hello/
를 입력하여 다음과 같은 페이지가 나오면 api 통신에 성공한 것이다.import random
...
@api_view(['GET'])
def randomAPI(request, id):
totalCalcs = Calc.objects.all() # 모델로 만들어진 객체를 모두 가져오기
randomCalcs = random.sample(list(totalCalcs), id) # id는 랜덤으로 나올 개수
serializer = CalcSerializer(randomCalcs, many=True) # 다양한 내용들에 대해 내부적으로도 직렬화
return Response(serializer.data)
from django.urls import path, include
from .views import helloAPI, randomAPI
urlpatterns = [
path("hello/", helloAPI),
path("random/<int:id>/", randomAPI),
]
from django.contrib import admin
from .models import Calc
# Register your models here.
admin.site.register(Calc)
$ python3 manage.py createsuperuser
http://127.0.0.1:8000/admin
http://127.0.0.1:8000/api/random/4/