REST API에 대한 기본 설명 : [Django] REST API & Rest framework
클라이언트는 url 주소를 통해서 서버에 request를 보내고, Django는 urls.py를 참고하여 해당 url에 매핑된 뷰를 찾아 실행한다. 이때 실행되는 뷰의 종류에는 클래스 기반 뷰(class-based view)와 함수 기반 뷰(function-based view)가 있다. Django의 REST framework를 사용할 때도 위의 이유로 두 가지 방법이 있다고 한다.
오늘 배운 내용은 함수 기반 api이다. 이후에 클래스 기반 api 내용도 작성해볼 예정이다. Django rest framework 공식 문서에 적힌 튜토리얼과 약간 다를 수 있다. 나는 유튜브의 강의를 참고했다. 강의가 영어라서.. 잘 이해하지 못한 부분들이 있을 수 있다.
먼저 장고 기본 설정들과 동일하게 세팅을 해준다.
# 프로젝트 디렉토리 생성
mkdir restframework
cd restframework
# 가상환경 생성
python3 -m venv myvenv
source myvenv/bin/activate
# django, djangorestframework 설치
pip install django
pip install djangorestframework
#프로젝트와 앱 생성
django-admin startproject myproject
cd myproject
django-admin startapp api_basic
그리고 settings.py 에서 다음 두 앱을 추가해주면 된다.
INSTALLED_APPS = [
...
'api_basic',
'rest_framework',
]
그러고 나서 초기 설정을 위해 migrate을 해준다.
python manage.py migrate
유투브 강의 내용에서는 초반에는 최소 모듈로 진행한 것을 더 많은 것들을 import 해오면서 조금 더 간단한 내용들로 대체해 가는데, 더 알아야 할 내용들인 간단한 내용들만 적어 본다.
먼저 우리가 사용할 DB 테이블로 model을 정의해야 한다. 여기서는 블로그 글에 해당하는 Article 객체를 만들었다.
from django.db import models
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
email = models.EmailField(max_length=100)
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
※model을 수정했으니 makemigrations, migrate 과정을 거쳐야 한다.
이후에 이 데이터들을 serialize(직렬화) 해주어야 한다. 직렬화란 데이터를 바이트 단위로 쪼개어서 좀 더 쉽게 전송하고 전송된 데이터를 원 상태의 데이터로 복구하는 일련의 과정들을 말한다. serializer.py라는 파일을 생성해서 정의해줄 예정인데 이 파일의 내부 형태는 forms.py와 비슷하다.
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
#fields =['id', 'title', 'author', 'email'] 이렇게 전송할 데이터 필드를 하나하나 선택할 수도 있음
fields = '__all__'
위의 형태로 어떤 데이터들을 전송해줄 지 결정하면 된다. 내가 추가하고 싶은 필드를 하나하나 추가해줘도 되지만, 일반적으로 모든 필드를 추가하고 싶다면 위의 코드처럼 작성해주면 된다.
다음은 views.py를 정해줄 차례이다. blog 객체를 만들어서 home에서는 모든 blog 글들을 다 볼 수 있게 했고, 각각의 상세 내용은 detail 페이지에서 볼 수 있도록 해주었던 것처럼, article_list 함수에서는 모든 Article들을 다 볼 수 있고, 상세 내용은 article_detail 함수를 통해 확인할 수 있게 해준다.
from django.shortcuts import render
from .models import Article
from .serializers import ArticleSerializer
from rest_framework.decorators import api_view #좀 더 간편하고 예쁘게 하기 위해서?
from rest_framework.response import Response
from rest_framework import status
# Create your views here.
@api_view(['GET', 'POST'])
def article_list(request):
if request.method == "GET":
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
elif request.method == "POST":
serializer = ArticleSerializer(data = data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status = status.HTTP_201_CREATED ) #created 되었다는 status임 (404 not found와 동일한 개념인 듯), status를 import 해온 후 이걸로 바뀜
return Response(serializer.errors, status= status.HTTP_400_BAD_REQUEST)
@api_view(['GET', 'PUT', 'DELETE'])
def article_detail(request, pk):
try:
article = Article.objects.get(pk= pk)
except Article.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND )
if request.method == 'GET':
serializer = ArticleSerializer(article)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = ArticleSerializer(article, data = request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status= status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
article.delete()
return Response(status = status.HTTP_204_NO_CONTENT)
이 때 import api_view를 하지 않고 csrf 관련 코드로도 작성할 수 있지만, api_view를 사용하지 않으면 각 Response도 Json인지 Http인지 정해줘야 하고 json parser도 이용해야 한다. 위의 코드를 이해하기 위해서는 HTTP 메서드의 Get, Post, Put, Delete에 대해서 알아야 하는데, 간단히 말하자면 CRUD가 각각
- Get = Read
- Post = Create
- Put = Update
- Delete = Delete
인 것으로 이해하면 된다. 이외에도 patch는 부분수정을 의미한다고 한다.
이해해보면 article_list 함수에서는 요청이 들어왔을 때 GET메서드를 요구하면 모든 aricle 데이터를 불러와서 json으로 받아오라는 뜻이며, POST 요청이라면 데이터를 입력할 수 있게 해주고 유효성 검사에서 통과하면 해당 데이터를 저장하라는 뜻이다. 이 때 유효성 검사에서 오류가 나면 에러 화면을 보여주면 된다.
article_detail 함수에서는 특정 아이디를 가진 article을 불러오되 실패하면 404페이지를 보여주라는 코드로 시작된다. 그리고 GET 메서드가 요청 들어온다면 데이터를 보여주고, PUT 메서드 요청이라면 유효성 검사를 통해 전면 수정하거나 에러를 보여주면 된다. DELETE 메서드 요청인 경우는 해당 id의 article을 삭제해주면 된다.
이렇게 views를 완성했으니 직접 확인해볼 수 있도록 url을 연결해주어야 한다. url 연결은 include를 통해 앱을 분리시켜줬고, 다음 코드는 앱 내 urls.py 코드이다.
from django.contrib import admin
from django.urls import path
from .views import article_list, article_detail
urlpatterns = [
path('article/', article_list),
path('detail/<int:pk>/', article_detail),
]
여기까지 했다면 런서버를 해서 확인해볼 수 있다.
주소창에 http://127.0.0.1:8000/article/ 라고 치면 다음과 같은 화면을 얻을 수 있다. 나는 테스트를 위해 첫 데이터는 /admin/ 페이지에서 추가했고(createsuperuser을 통해서 로그인하는 것 잊지 말아야 한다), 그 외의 데이터들은 post 메서드를 이용해서 추가했다.

article_list에서 해줬던 것처럼 GET과 POST를 위해 버튼이 생긴 것을 볼 수 있다.
http://127.0.0.1:8000/detail/1/
위의 url로 들어가면 다음 화면도 확인할 수 있다. detail에서는 DELETE 버튼과 PUT 버튼이 생긴 것을 볼 수 있다. 만약 put으로 내용을 수정하고 싶다면 오른쪽 사진처럼 json 파일 내의 내용을 복사해서 수정할 부분만 수정한 후 put버튼을 눌러주면 된다.


이건 장고에서 api_view로 제공해주는 형태인데, 이외에도 postman이라는 앱으로 api가 전송된 것을 확인할 수도 있다. postman 다운받기

위 화면은 Postman에서 detail을 get한 모습이다. 이렇게 api가 잘 전송이 되었는지 외부 앱으로도 테스트 해볼 수 있다.
댓글