DRF 02 setting

Seungju Hwang·2020년 12월 14일
0

django

목록 보기
6/11
post-thumbnail

Intro

'무엇'을 '어떠한' 방식으로 응답하고 있는지에 초점을 맞추자


HTML 응답

우리가 지금까지 Django를 활용해 응답한 방식

하지만 HTML은 그 자체로 구조화 된(완결성을 갖춘) 문서기 때문에 데이터를 추출하는 작업에 적합하지 않다.

이제는 데이터(정보) 전달에 초점을 둔 JSON을 응답하는 서버를 만들어 보자


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)

1 Django core serializers 활용해서 응답

필드를 직접 구성하지 않고 articles QuerySet 정보를 활용해서 직렬화한다.

HttpResponsecontent_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')

2 DRF 활용해서 응답

앞으로 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)
profile
기록하는 습관은 쉽게 무너지지 않아요.

0개의 댓글