'무엇'을 '어떠한' 방식으로 응답하고 있는지에 초점을 맞추자
우리가 지금까지 Django를 활용해 응답한 방식
하지만 HTML은 그 자체로 구조화 된(완결성을 갖춘) 문서기 때문에 데이터를 추출하는 작업에 적합하지 않다.
이제는 데이터(정보) 전달에 초점을 둔 JSON을 응답하는 서버를 만들어 보자
필드를 직접 구성해야 한다.
딕셔너리가 아닌 경우 safe=False
파라미터를 추가해야 한다.
from django.http.response import JsonResponse
from .Models import Article
def article_list_json_1(request):
articles = Article.objects.all()
articles_json = []
for article in articles:
articles_json.append({
# 각 필드를 주석 처리
'id': article.id,
'title': article.title,
'content': article.content,
'created_at': article.created_at,
'updated_at': article.updated_at,
})
return JsonResponse(articles_json, safe=False)
필드를 직접 구성하지 않고 articles
QuerySet 정보를 활용해서 직렬화한다.
HttpResponse
는 content_type
키워드 인자를 활용해 다양한 타입으로 응답할 수 있는데, 아무런 값도 넘기지 않으면 기본값으로 text/html
을 활용한다.
# articles/views.py
from django.http.response import JsonResponse, HttpResponse
from django.core import serializers
from .models import Article
def article_list_json_2(request):
articles = Article.objects.all()
data = serializers.serialize('json', articles)
# print(type(data)) str
return HttpResponse(data, content_type='application/json')
앞으로 DRF를 활용할겁니다.
$ pip install djangorestframework
# settings.py
INSTALLED_APPS = [
...
'rest_framework',
]
# articles/serializers.py
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('title', 'content', 'created_at', 'updated_at',)
# fields = '__all__'
# articles/views.py
from rest_framework.response import Response
from .serializers import ArticleSerializer
def article_list_json_3(request):
# 직렬화 할 데이터 DB에서 가져오기
articles = Article.objects.all()
# ArticleSerializer를 통해 직렬화하기 (QuerySet이라서 many=True 옵션 필수)
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)