본문 바로가기

Django

6) Django REST API (rest_framework)

https://www.django-rest-framework.org/

 

Home - Django REST framework

 

www.django-rest-framework.org

 

Django 환경에서 REST API를 쉽게 만들어주는 프레임워크가 있다.

짧게 DRF(Django Rest Framework)라고도 한다.

DRF를 사용하는 이유는 프론트엔드와 백엔드를 나누는데 있어서 REST API 환경이 유리하기 때문이다.

DRF를 사용하여 REST API를 구축하면 Django 서버를 백엔드로 두고서 웹, 앱, 모바일 웹, 앱 등 각 프론트엔드만 개발하면 되기 때문이다. 기존의 Django에서 DB를 다루는 QuerySet 형태는 다른 환경과 소통하는데 있어서 불리하기 때문에 DRF의 Serializer를 통해서 JSON 형식의 데이터로 만들어 대부분의 환경에서 사용가능하게 하는 것이다.

 

django-admin startapp api

 

간단하게 api이름의 app을 만들어주고, DRF를 설치한다.

 

pip install djangorestframework
pip install markdown       # Markdown support for the browsable API.
pip install django-filter  # Filtering support
# settings.py
INSTALLED_APPS = [
    ...
    'rest_framework',
]
# urls.py
urlpatterns = [
    ...
    path('api-auth/', include('rest_framework.urls'))
]

 

홈페이지에 나온데로 pip install을 진행하고 settings.py 와 urls.py 파일에 내용을 추가해주었다.

그런데 rest_framework could not be resolved 라는 에러가 발생했고, 

pip install django-rest-framework 로 해결되었다.

 

# models.py
from django.db import models

# Create your models here.
class TestModel(models.Model):
    name = models.CharField(max_length = 13)
    age = models.DecimalField(max_digits = 3, decimal_places = 0)

    def __str__(self):
        return self.name

 

간단하게 이름과 나이 정보를 저장할 model을 만들어 주고 api 하위 파일로 serializers.py 파일을 만든다.

 

# serializers.py
from rest_framework import serializers
from .models import TestModel

class TestSerializer(serializers.ModelSerializer):
    class Meta:
        model = TestModel
        fields = '__all__'

form과 유사하게 Meta class를 내부에서 사용하여 model을 이용한다.

serializer의 역할은 데이터를 JSON 형식으로 만들어준다.

서버와 통신을 할 때 JSON 형식을 가장 많이 사용하기 때문에 지원해주는 기능으로 보인다. (Custom 가능)

 

다음은 views.py 다.

# views.py
from rest_framework import viewsets
from rest_framework import permissions

from .serializers import TestSerializer
from .models import TestModel

class TestView(viewsets.ModelViewSet):
    queryset = TestModel.objects.all()
    serializer_class = TestSerializer
    permission_classes = (permissions.AllowAny,)

rest_framework가 지원해주는 view에는 3가지 방식이 있다.

1. Views

views에는 class 기반의 APIView와 function 기반의 api_view가 있다.

- from rest_framework.views import APIView

- from rest_framework.decorators import api_view

2. Generic views

class 기반이며, 구현되어 있는 class를 상속받아 사용할 수 있다.

3. Viewsets

class 기반이며, 위의 모든걸 합쳐놓은 것 같다. 결론은 Viewsets을 사용하자.

자세한 것을 알고 싶다면 같은 기능을 기준으로 하나하나 사용해보면서 비교하는게 좋을 것 같다.

 

위의 코드에서는 viewsets을 사용하였고, permission 부분은 인증에 관한 것인데 User에 대한 정보는 포함하지 않아서 AllowAny로 해주었다.

 

# urls.py
from django.urls import path, include
from rest_framework.urlpatterns import format_suffix_patterns
from .views import TestView, test

app_name = 'api'

test_list = TestView.as_view({
    'post': 'create',
    'get': 'list' 
})

test_detail = TestView.as_view({
    'get': 'retrieve',
    'put': 'update',
    'patch': 'partial_update',
    'delete': 'destroy'
})

urlpatterns = format_suffix_patterns([
    path('auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('tests/', test_list, name='test_list'),
    path('tests/<int:pk>/', test_detail, name='test_detail'),
])

 

class 기반의 View를 사용하면 .as_view 형식을 사용할 수 있다.

get, post, put, patch, delete 등에 해당하는 create, list, update, partial_update, destory는 viewsets에 이미 구현이 되어있는 기능이다. 따라서 Http 함수에 따라 정보를 처리해준다.

 

http://127.0.0.1:8000/api/tests/ 로 접근하면 다음과 같은 화면을 볼 수 있다.

 

 

DRF에서 API를 확인할 수 있는 기본적인 UI를 제공해준다.

name과 age를 입력한 뒤, POST를 누르면 정보가 추가되는 것을 확인 할 수 있다.

또한, id값을 url 뒤에 붙여주면 해당하는 데이터에 접근 할 수 있다.

 

PUT 버튼을 통해서 정보를 수정하는 PUT의 기능이 잘 동작하는 것도 볼 수 있다.

 

다음에는 api를 통해 받아온 JSON 정보를 보여주기 위해 javascript의 fetch 기능을 이용해보겠다.

'Django' 카테고리의 다른 글

7) Django to the server with fetch  (0) 2022.11.17
5) Django model 사용하기!  (0) 2022.11.01
4) Django template  (0) 2022.10.25
3) Django mysql 연동하기  (0) 2022.10.18
2) Django App 만들기  (0) 2022.10.12