본문 바로가기

Django

Django DRF(Django rest framework) 시작하기

728x90

DRF

  • Django REST framework, 웹 API 구축을 위한 툴킷
  • RESTful API 서버 구축을 용이하게 해주는 오픈소스 라이브러리
  • 파이썬 데이터를 JSON 파일로 직렬화 가능한 장점을 가짐 
  • 개발 및 유지보수가 간편한 장점을 가짐

기본 설정

Django REST framework 설치

$ pip install djangorestframework
  • Django rest framework install

 
Django REST framework 등록

  • project settings.py에 rest_framework 등록

 

프로젝트 urls 설정

# project/urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include('articles.urls'))
]
  • 애플리케이션 이름을 직접 적었던 이전과 다르게, 'api/v1/'으로 이동경로 설정

model 정의

# articles/models.py

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()
  • 데이터베이스 테이블 생성과정
  • 정의한 필드는 데이터베이스의 테이블이 됨

 

serializer

serializer 파일 생성

$ touch serializers.py
  • 애플리케이션 폴더 내부에 serializers.py 파일 생성

 
serializer 정의

# articles/serializer.py

from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'
  • 정의한 model을 바탕으로 작성 (작성 방법은 model과 유사)
  • serializer는 직렬화 작업 수행
  • fields는 일부로 설정 가능

 

데이터베이스 반영

$ python manage.py makemigrations
$ python manage.py migrate
  • model 변동 시와 같이 serializer 변동 시에도 두 작업 진행 필수

urls 작성

# articles/urls.py

from django.urls import path
from . import views


urlpatterns = [
    path('index/', views.index),
    path('create/', views.create),
    path('update/<int:article_pk>/', views.update),
    path('delete/<int:article_pk>/', views.delete),
]
  • 기존 urls 정의 방법과 유사
  • 애플리케이션 이름은 적을 필요 없음

views 작성

전체 코드 캡쳐

  • 각 코드 의미는 사진 및 아래 코드블럭 주석 참고

 
import 목록

# articles/views.py

from django.shortcuts import render, get_object_or_404
from .models import Article
from .serializer import ArticleSerializer
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status

 
 
index

# articles/views.py

@api_view(['GET'])
def index(request):
    # Article 모델에 있는 모든 인스턴스 가져오기
    articles = Article.objects.all()
    # ArticleSerializer를 사용해서 articles(Article의 모든 인스턴스를 담은 변수)를 직렬화
    serializer = ArticleSerializer(articles, many=True)
    # Response를 사용해서 serializer로 직렬화한 데이터를 반환
    return Response(serializer.data)
  • 전체 article 조회

 
create

# articles/views.py

@api_view(['POST'])
def create(request):
    # ArticleSerializer데이터에 요청 데이터를 넣어 직렬화
    serializer = ArticleSerializer(data=request.data)
    # 유효성 검사를 통과하지 못하면 오류 반환
    if serializer.is_valid(raise_exception=True):
        # 유효성 검사 통과 시 저장, serializer의 데이터 반환
        serializer.save()
        return Response(serializer.data)
  • article 생성

 
update

# articles/views.py
    
@api_view(['PUT'])    # 수정은 무조건 PUT 사용
def update(request, article_pk):
    # article 변수에 수정할 pk를 가진 인스턴스를 찾아서 가져오기
    article = get_object_or_404(Article, pk=article_pk)
    # 요청 데이터를 넣어 직렬화, article을 넣어 그 인스턴스의 내용을 수정
    serializer = ArticleSerializer(article, data=request.data)
    # 수정한 내용 유효성 검사하기 -> 통과 시 저장
    if serializer.is_valid(raise_exception=True):
        serializer.save()

        return Response(serializer.data)
  • 기존 article 수정

 
delete

# articles/views.py

@api_view(['DELETE'])    # 삭제는 무조건 DELETE 사용
def delete(request, article_pk):
    # 삭제할 pk를 가진 데이터 가져와 article 변수에 저장, 삭제
    article = get_object_or_404(Article, pk=article_pk)
    article.delete()

    # 삭제 후 해당 내용이 없다는 HTTP 상태 반환
    return Response(status=status.HTTP_204_NO_CONTENT)
  • 기존 article 삭제