Django Rest Framework로 API 개발하기

nathan·2021년 11월 18일
0

Django

목록 보기
22/22
post-custom-banner

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를 설계한다.

초기 세팅

기본적으로 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 [앱 이름]

settings.py 설정하기

코드 에디터(여기서는 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_APPSapprest_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 model 만들기

1) models.py

  • 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()

2) serializers.py

여기서 Serializer 란?

  • 장고 모델 데이터를 JSON 타입으로 바꿔주는 작업을 해준다.
  • 이를 직렬화라고 한다.
  • 장고 모델 데이터를 템플릿에 뿌려주면 웹에 보여지듯, JSON 타입으로 뿌려주면 api로 통신이 되는 것이다.
  • 장고 모델 데이터를 JSON 타입으로 바꿔주는 기계라고 이해하자.
  • app 폴더 내에 serializers.py를 만든다.
    • 여기서 serializer 관련 모듈과 모델을 import 한다.
    • 모델 데이터가 주어지면 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')

3) views.py & urls.py

  • DRF가 어떤 식으로 실행되는지 확인하기 위해 간단한 HelloAPI 함수부터 만들어보자.
  • 다음 view 함수를 생성하기 위해 미리 import를 적어주었다.
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을 관리한다.

app 내의 urls.py

from django.urls import path, include
from .views import helloAPI

urlpatterns = [
    path("hello/", helloAPI),
    
]

project 내의 urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('api.urls')),
]

url 입력해보기

  • 주소창에 http://127.0.0.1:8000/api/hello/를 입력하여 다음과 같은 페이지가 나오면 api 통신에 성공한 것이다.
  • 앞으로 이런 방식을 통해 api를 개발하면 된다.

새로운 api 만들기

  • 랜덤으로 데이터를 정해진 개수만큼 꺼내오는 api를 만들고자 한다.

views.py

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)

urls.py

from django.urls import path, include
from .views import helloAPI, randomAPI

urlpatterns = [
    path("hello/", helloAPI),
    path("random/<int:id>/", randomAPI),
]
  • 그리고 관리자 페이지에 모델을 register하여 관리할 수 있도록 처리한다.

admin.py

from django.contrib import admin
from .models import Calc
# Register your models here.
admin.site.register(Calc)
  • 위와 같이 등록해주면 관리자 페이지에서 모델을 관리할 수 있게 된다.

  • 그리고 관리자 페이지에 접속하고 관리하기 위해 super 계정을 만들어 준다.
$ python3 manage.py createsuperuser
  • 이후 관리자 페이지에 들어가기 위해 아래의 url을 주소창에 치면 다음 페이지가 뜬다.
    http://127.0.0.1:8000/admin

  • 다음과 같이 Calc 모델에 대한 관리를 할 수 있게 된다.
  • 임시로 데이터를 4개 가량 넣어보려고 한다.

  • http://127.0.0.1:8000/api/random/4/
    • 성공적으로 진행되었음을 알 수 있다!

Reference

https://www.youtube.com/watch?v=ywJWbAF6txQ

profile
나는 날마다 모든 면에서 점점 더 나아지고 있다.
post-custom-banner

0개의 댓글