Web/Django

DRF (Django REST Framework)

5_ssssseung 2021. 5. 8. 04:02

DRF (Django REST Framework)

  • Web API 구축을 위한 강력한 toolkit을 제공
  • REST framework 개발에 필요한 다양한 기능을 제공

 

Serialization (직렬화)

  • 데이터 구조나 객체 상태를 동일하거나 다른 컴퓨터 환경에 저장하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정
  • 예를 들어 DRF의 Serializer는 Django의 Queryset및 Model Instance와 같은 복잡한 데이터를, JSON, XML 등의 유형으로 쉽게 변환할 수 있는 Python 데이터 타입으로 만들어 줌
  • DRF의 Serializer는 Django의 Form 및 ModelForm 클래스와 매우 유사하게 작동

 

Django와의 비교

  Django DRF
Response HTML JSON
Model ModelForm ModelSerializer

 

api_view decorator

ref : https://www.django-rest-framework.org/api-guide/views/#api_view

  • view 함수가 응답해야하는 http method 목록을 설정
  • 작성하지 않으면 기본적으로 GET 메서드만 허용되며, 목록에 작성되지 않은 method일 경우 405 Method Not Allowed를 반환

 

DRF 예시

Django에서 Json으로 변환해서 응답해주는 3가지 방법

 

  • 기존 html을 렌더링 하는 Django
from django.shortcuts import render
from .models import Article


def article_html(request):
    articles = Article.objects.all()
    context = {
        'articles': articles,
    }
    return render(request, 'articles/article.html', context)

 

 

  • Json 객체를 직접 만들어서 리턴 받는 방법
from django.http.response import JsonResponse
from .models import Article


def article_json_1(request):
    articles = Article.objects.all()
    articles_json = []

    for article in articles:
        articles_json.append(
            {
                'id': article.pk,
                'content': article.content,
            }
        )
    # 딕셔너리가 아닌 다른 타입이 파싱이 되어야 한다면 'safe=False' 옵션 필요
    # articles_json은 현재 리스트 타입이기 때문
    return JsonResponse(articles_json, safe=False)

 

from django.http.response import HttpResponse
from django.core import serializers
from .models import Article


def article_json_2(request):
    articles = Article.objects.all()
    data = serializers.serialize('json', articles)
    
    # 이미 Json 데이터이므로 Http로 응답을 보내기 위한 HttpResponse
    # 응답하는 데이터 타입을 작성해줘야 함
    return HttpResponse(data, content_type='application/json')

 

# views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import Article
from .serializers import ArticleSerializer


@api_view(['GET'])
def article_json_3(request):
    articles = Article.objects.all()
    serializer = ArticleSerializer(articles, many=True)
    return Response(serializer.data)
# serializers.py
from rest_framework import serializers
from .models import Article


class ArticleSerializer(serializers.ModelSerializer):

    class Meta:
        model = Article
        fields = '__all__'

 

참고사항

'Web > Django' 카테고리의 다른 글

DRF - 1:N model  (0) 2021.05.09
DRF - single model  (0) 2021.05.09
REST API  (0) 2021.05.08
django_09_model_relationship  (0) 2021.04.01
django_08_model_relationship  (0) 2021.03.29