JSON
: 속성-값 쌍, 배열 자료형 또는 기타 모든 시리얼화 가능한 값 또는 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷
- 파이썬의 dictionary, 자바스크립트의 objectc처럼 C 계열의 언어가 갖고 있는 자료구조로 쉽게 변환할 수 있는 key-value 형태의 구조를 갖고 있음
이제 HTML이 아닌 JSON 데이터를 응답하는 서버만! 구축해보자
- JSON 데이터를 받아 화면을 구성하여 사용자에게 보여주는 것은 Front-end Framework가 담당
Django Serializer를 사용한 JSON 응답
Serialization (직렬화)
: 데이터 구조나 객체 상태를 동일 혹은 다른 컴퓨터 환경에 저장하고, 나중에 재구성할 수 있는 포맷으로 변환하는 과정
즉, 어떠한 언어나 환경에서도 "나중에 다시 쉽게 사용할 수 있는 포맷으로 변환하는 과정"
변환 포맷은 대표적으로 json (가장 보편적), xml, yaml이 있음
DRF를 활용하여 JSON 데이터를 응답받는 Django 서비스 구축하기
장고에서는 Serializer를 클래스로 정의해놓고 받아오는 데이터 포맷을 보낼곳의 데이터 형식으로 변환할때 사용한다
- Django의 From 및 ModelForm 클래스와 매우 유사하게 작동함
DRF(Django REST framework)
: Django 에서 Restful API 서버를 쉽게 구축할 수 있도록 도와주는 오픈소스 라이브러리
DRF 공식문서
DRF 설치
pip install djangorestframework
ModelSerializer
: 모델 필드에 해당하는 필드가 있는 Serialier 클래스를 자동으로 만들 수 있는 shortcut 제공
1, Model 정보에 맞춰 자동으로 필드 생성
2. serializer에 대한 유효성 검사기 자동으로 생성 : is_valid()
3. .create() 및 .update()의 간단한 기본 구현 포함
* Serializer 정의하기
# app/serializers.py
from rest_framework import serializers
from .models import Article
# ModelForm과 유사한 구조와 사용법을 가진다
# ModelSerializer 상속받기
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
* url 작성
# articles/urls.py
urlpatterns = [
...생략
path('json-3/', views.article_json_3),
]
* 함수 작성
from rest_framework.response import Response
from rest_framework.decorators import api_view
# DRF에서 api_view 데코레이터 작성은 필수
@api_view(['GET'])
def article_json_3(request):
articles = Article.objects.all()
# articles(쿼리셋)을 JSON으로 쉽게 변환할 수 있는 python 데이터 타입으로 변환시켜줌
serializer = ArticleSerializer(articles, many=True)
# .data => json 파일로
return Response(serializer.data)
-> 단일 객체 인스턴스 대신 객체 목록을 Serialize 하려면 many = True 옵션 지정
DRF - Single Model
requests method 설계
GET | POST | PUT | DELETE | |
articles/ | 전체 글 조회 | 글 작성 | 전체 글 수정 | 전체 글 삭제 |
articles/<int:article_pk>/ | 상세 글 조회 | . | 해당 글 수정 | 해당 글 삭제 |
* articles/serializers.py
from rest_framework import serializers
from .models import Article
class ArticleListSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('id', 'title',)
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
* articles/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('articles/', views.article_list),
path('articles/<int:article_pk>', views.article_detail),
]
views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status
from .models import Article
from .serializers import ArticleListSerializer, ArticleSerializer
from articles import serializers
@api_view(['GET', 'POST'])
def article_list(request):
# 전체 게시글 조회
if request.method == 'GET':
articles = Article.objects.all()
serializer = ArticleListSerializer(articles, many=True)
return Response(serializer.data)
# 새로운 게시글 작성
# 생성이 성공했을 때 : 201 Created, 실패했을 때 : 400 Bad request
elif request.method == 'POST':
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
@api_view(['GET','DELETE', 'PUT'])
def article_detail(request, article_pk):
article = Article.objects.get(pk=article_pk)
# 상세 게시글 조회
if request.method == 'GET':
serializer = ArticleSerializer(article)
return Response(serializer.data)
# 상세 게시글 삭제
elif request.method == 'DELETE':
article.delete()
# 삭제 했다는 메시지 반환
return Response({'delete':f'데이터 {article_pk}번 글이 삭제되었습니다.'})
# 상세 게시글 수정
elif request.method == 'PUT':
serializer = ArticleSerializer(article, data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
* api_view 데코레이터
: DRF view 함수가 응답해야 하는 HTTP 메소드 목록을 받음
- 기본적으로 GET 메서드만 허용되며 다른 메서드 요청에 대해서는 405 Method Not Allowed로 응답
* raise_exception
: "유효하지 않은 데이터에 대해 예외 발생시키기"
- is_valid() 는 유효성 검사 오류가 있는 경우 ValidationError 예외를 발생시키는 선택적 raise_exception 인자를 사용할 수 있음
- DRF에서 제공하는 기본 예외 처리기에 의해 자동으로 처리되며 기본적으로 HTTP 400 응답을 반환
한 쪽 모니터에는 드라마 틀어놓고 실습과제 하는 시간 = 요즘 힐링하는 방법~
왜 옷소매 이제서야 봤지,,, 마지막화 보고나서는 눈이 퉁퉁 부어버렸다,,흑
내가 궁녀였으면 임금이랑 사랑안해,,! 모른척 지나가줘 전하,,
'Web > Django' 카테고리의 다른 글
URL (0) | 2022.10.17 |
---|---|
pjt (0) | 2022.10.07 |
실습 - 1:N 을 활용한 app 작성 (0) | 2022.10.06 |
쿠키와 세션 (0) | 2022.09.08 |
Django Form (0) | 2022.09.07 |
댓글