Programming Language/Django

Django 12)REST API_2

Sergemeow 2023. 4. 13. 15:39
  • API
    • Application Programming Interface
    • 애플리케이션과 프로그래밍으로 소통하는 방법
      • 개발자가 복잡한 기능을 보다 쉽게 만들 수 있도록 프로그래밍 언어로 제공되는 구성
    • API를 제공하는 애플리케이션과 다른 소프트웨어 및 하드웨어 등의 것들 사이의 간단한 계약(인터페이스)이라고 볼 수 있음
    • API는 복잡한 코드를 추상화하여 대신 사용할 수 있는 몇가지 더 쉬운 구문을 제공
  • Web API
    • 웹 서버 또는 웹 브라우저를 위한 API
    • 현재 웹 개발은 모든 것을 하나부터 열까지 직접 개발하기보다 여러 Open API를 활용하는 추세
    • 대표적인 Third Party Open API 서비스 목록
      • Youtube API
      • Naver Papago API
      • Kakao Map API
    • API은 다양한 타입의 데이터를 응답
      • HTML, XML, JSON 등

REST

  • Representational State Transfer
  • API Server를 개발하기 위한 일종의 소프트웨어 설계 방법론
  • 자원을 정의하고 자원에 대한 주소를 지정하는 전반적인 방법

REST API 써보기

# my_api/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')),
]
# articles/urls.py

from django.urls import path
from . import views

urlpatterns = [
	path('html/', views.article_html),
	path('json-1/', views.article_json_1),
	path('json-2/', views.article_json_2),
	path('json-3/', views.article_json_3),
]

JsonResponse()를 사용한 JSON 응답

  • 문서(HTML) 한 장을 응답하는 것이 아닌 JSON 데이터를 응답해보기
  • Django가 기본적으로 제공하는 JsonResponse 객체를 활용하여 Python 데이터 타입을 손쉽게 JSON으로 변환하여 응답 가능
# articles/views.py

from django.http.response import JsonResponse

def article_json_1(request):
	articles = Article.objects.all()
	articles_json = {}

	for article in articles:
		articles_json.append(
			{
				'id':article.pk,
				'title': article.title,
				'content': article.content,
				'created_at': article.created_at,
				'updated_at': article.updated_at,
			}
		)
	return JsonResponse(articles_json, safe=False)

Django Serializer를 사용한 JSON 응답

  • Django의 내장 HttpResponse()를 활용한 JSON 응답
  • JSON의 모든 필드를 일일히 작성할 필요 없음
# articles/views.py

from django.http.response import JsonResponse, HttpResponse
from django.core import serializers

def article_json_2(request):
	articles = Article.objects.all()
	data = serializers.serialize('json', articles)
	return HttpResponse(data, content_type='application/json')

Serialization

  • “직렬화”
  • 여러 시스템에서 활용하기 위해 데이터 구조나 객체상태를 나중에 제구성할 수 잇는 포맷으로 변환하는 과정
  • 대표적 포맷: json, xml, yaml
  • Django의 serialize()는 Queryset 및 Model Instance와 같은 복잡한 데이터를 JSON, XML 등의 유형으로 쉽게 변환할 수 있는 Python 데이터 타입으로 만들어 줌

Django REST framework를 사용한 JSON 응답

  • Django REST framework(DRF)
    • Django에서 Restful API 서버를 쉽게 구축할 수 있도록 도와주는 오픈소스 라이브러리
    • Web API 구축을 위한 강력한 toolkit 제공
    • 참조: www.django-rest-framework.org/
# settings.py

INSTALLED_APPS = [
	'...'
	'rest_framework',
	'...'
]
  • ModelForm과 유사한 ModelSerializer 구조 및 사용법 확인
# articles.serializers.py

from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
	class Meta:
		model = Article
		fields '__all__'
# articles/views.py

@api_view()
def article_json_3(request):
	articles = Article.objects.all()
	serializer = ArticleSerializer(articles, many=True)
	return Response(serializer.data)

Django REST framework - Single Model

  • Postman
    • API를 구축하고 사용하기 위한 플랫폼
    • API를 빠르게 만들 수 있는 여러 도구 및 기능을 제공

# urls.py

from django.urls import path
from articles import views

urlpatterns = [
	path('articles/', views.article_list),
]
  • DRF 설치, 등록 및 패키지 목록 업데이트
    • pip install djangorestframework

ModelSerializer 작성

  • articles/serializers.py 생성
    • serializers.py의 위치나 파일명은 자유롭게 작성 가능
  • ModelSerializer 작성
# articles/serializers.py

from rest_framework import serializers
from .models import Article

class ArticleListSerializer(serializers.ModelSerializer):
	class Meta:
		model = Article
		fields = ('id', 'title', 'content',)
  • ModelSerializer 클래스는 모델 필드에 해당하는 필드가 있는 Serializer 클래스를 자동으로 만들 수 있는 shortcut을 제공
    • Model 정보에 맞춰 자동으로 필드를 생성
    • serializer에 대한 유효성 검사기를 자동으로 생성
    • .create() 및 .update()의 간단한 기본 구현이 포함됨

예) QuerySet 객체 serialize

articles = Article.objects.all()

serializer = ArticleListSerializer(articles, many=True)
serializer.data
... # 데이터 출력됨

Build RESTful API - Article

GET - List

  • 게시글 데이터 목록 조회하기
  • DRF에서 api_view 데코레이터 작성 필수
# articles/urls.py

urlpatterns = [
	path('articles/', views.article_list),
]
# articles/views.py

from rest_framework.response import Response
from rest_framework.decorators import api_view

from.models import Article
from.serializer import ArticleListSerializer

# api_view 데코레이터를 통해 GET메서드만 허용. 
@api_view(['GET'])
def article_list(request):
	articles = Article.objects.all()
	serializer = ArticleListSerializer(articles, many=True)
	return Response(serializer.data)

GET - Detail

  • 단일 게시글 데이터 조회하기
  • 각 데이터의 상세 정보를 제공하는 ArticleSerializer 정의
# articles/serializers.py

class ArticleSerializer(serializers.ModelSerializer):
	class Meta:
		model = Article
		fields = '__all__'
# articles/urls.py

urlpatterns = [
	...
	path('articles/<int:article_pk>/', views.article_detail),
]
# articles/views.py

from .serializers import ArticleListSerializer, ArticleSerializer

@api_view(['GET'])
def article_detail(request, article_pk):
	article = Article.objects.get(pk=article_pk)
	serializer = ArticleSerializer(article)
	return Response(serializer.data)

'Programming Language > Django' 카테고리의 다른 글

Django 14)REST API_4  (0) 2023.04.18
Django 13)REST API_3  (0) 2023.04.18
Django 11)REST API_1  (0) 2023.04.13
Django 10)Authorization/Authentication_2  (0) 2023.04.12
Django 09)Authorization/Authentication_1  (0) 2023.04.12