안녕하세요.
평소 Django REST Framework를 이용하여 API를 만드는데
개념이 안잡혀있는 듯한 느낌이 강해서 한번 복습할 겸 내용을 정리해보려고 합니다.
그 전에 간단하게 테스트할 수 있는 코드를 작성해보겠습니다.
api/ 폴더 안에 list.py를 생성해주겠습니다.
list.py
from django.views.generic import View
from django.http.response import HttpResponse
class PostListAPIView(View):
def get(self, request, *args, **kwargs)
return HttpResponse('Hello World')
urls.py
urlpatterns = [
path('posts/', PostListAPIView.as_view(), name='list')
]
간단하게 /api/posts/ 라는 URL로 GET 요청 시 HttpResponse로 'Hello World' 가 출력되는 코드입니다.
보시면 View라는 것을 상속받아 사용하고 있습니다.
def get(self, request, *args, **kwargs):
data = {
"Hello": "World",
}
return HttpResponse(data)
# 위와 같이 data를 HttpResponse로 넘겨주게 되면 우리가 원하는 값이 제대로 나오지 않습니다.
import json
return HttpResponse(
json.dumps(data), # json.dumps를 이용하면 Dict -> Json으로 바뀐다.
content_type="application/json",
)
# 그렇다면 게시글의 목록들을 가져와서 데이터를 만들어보겠습니다.
def get(self, request, *args, **kwargs):
data = [
{
"title": post.title,
"content": post.content,
"youtube_original_url": post.url
}
for post in Post.objects.all()
]
# 위와 같은 코드를 돌려보면 Post 객체 값이 들어가게 됩니다.
위 코드에는 몇 가지 단점이 있습니다.
1. application/json -> json 형식으로만 데이터를 받을 수 있습니다.
2. json을 serializer하고 deserializer 할 때 data를 수동으로 변경해줘야합니다.
Django Rest Framework
- API 만드는데 최적화
- Django의 View 만큼이나 복잡하다.
pip install djangorestframework
INSTALLED_APPS = [ 'rest_framework' ]
from rest_framework.views import APIView
from rest_framework.response import Response
class PostListAPIView(APIView):
def get(self, request, *args, **kwargs):
data = [
{
"title": post.title,
"content": post.content,
"youtube_original_url": post.url
}
for post in Post.objects.all()
]
return Response(data)
APIView와 Response를 변경해주었는데 Django REST framework에서 기본적으로 제공해주는 템플릿이 생성되었고,
Postman으로 request 시 데이터도 정확히 잘 나오는 것을 확인할 수 있습니다.
from rest_framework.generics import ListAPIView
from posts.serializers import PostModelSerializer
class PostListAPIView(ListAPIView):
queryset = Post.objects.all()
# ListAPIView는 기본적으로 queryset or get_queryset, serializer_class 가 필요합니다.
# serializers 폴더를 생성해주고, 안에 파일을 생성합니다.
# serializers/post.py
from rest_framework.serializer import serializer
class PostModelSerializer(serializer.ModelSerializer):
username = serializers.CharField(source='user.username') # user.username을 추가
class Meta:
model = Post
fields = ['title', 'content']
위 코드로 실행하게 되면 Post 모델에 있는 fields에 지정한 필드들이 Serializer되어서 json 객체로 출력 됩니다.
'Web > Django' 카테고리의 다른 글
| Django 삽질기 쿼리 지연? (0) | 2020.06.15 |
|---|---|
| Django - 기간 별 회원가입자 수 가져오기 (0) | 2020.04.22 |
| Django - Multiple databases(using, inspectdb) (0) | 2020.04.20 |
| Django - 1월~12월까지의 데이터 가져오면서 변수명 만들기 (0) | 2020.04.20 |
| Django - Cookbook ORM(쿼리문) 연습하기 - 1 (0) | 2020.04.15 |
댓글