본문 바로가기
Programming/Python

django(5)-Django REST Framework

by p4cho 2024. 3. 21.
728x90

DRF(Django REST Framework)

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

DRF는 django에서 Web API를 구현할때 필요한 인증/인가, 직렬화 등 유용한 기능을 미리 구현해둔 프레임워크이다.

Installation

# 먼저 Django가 설치 되어 있어야 한다.
(django-practice-py3.12) $ poetry add djangorestframework
Using version ^3.15.0 for djangorestframework

Updating dependencies
Resolving dependencies... (0.1s)

Package operations: 1 install, 0 updates, 0 removals

  - Installing djangorestframework (3.15.0)

Writing lock file

DRF 실습을 위한 API app 생성

(django-practice-py3.12) $ django-admin startapp api
(django-practice-py3.12) $ tree api
api
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

2 directories, 7 files

Serializer 작성

api/serializers.py

from django.contrib.auth.models import Group, User
from rest_framework import serializers


class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['url', 'username', 'email', 'groups']


class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ['url', 'name']

HyperlinkedModelSerializer

DRF에서는 HyperlinkedModelSerializer를 사용하는 것을 권장하고 있다.
HyperlinkedModelSerializer는 장고레스트 프레임워크의 클래스로 기본 키 대신 하이퍼링크를 사용하여 관계를 표현하는데, 이 클래스는 ModelSerializer 클래스와 비슷하지만 다음과 같은 차이점이 있다.

  • id(pk) 필드 대신 url 필드가 포함된다.(필요시 추가할 수 있음)
  • 다른 인스턴스와의 관계는 기본 키가 아닌 하이퍼링크로 갖는다.
  • 기본적으로 id 필드를 포함하지 않는다.
  • 관계는 PrimaryKeyRelatedField 대신 HyperlinkedRelatedField를 사용 한다.

View 작성

api/views.py

from django.contrib.auth.models import Group, User
from rest_framework import permissions, viewsets

from .serializers import GroupSerializer, UserSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    User들을 보거나 편집할 수 있는 API endpoint
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    permission_classes = [permissions.IsAuthenticated]


class GroupViewSet(viewsets.ModelViewSet):
    """
    Group들을 보거나 편집할 수 있는 API endpoint
    """
    queryset = Group.objects.all().order_by('name')
    serializer_class = GroupSerializer
    permission_classes = [permissions.IsAuthenticated]

모든 일반적인 동작을 처리하기 위한 여러 뷰를 작성하는 대신 ViewSets 클래스로 그룹화한다.

필요한 경우 이를 개별 View로 쉽게 나눌 수 있지만 ViewSets를 사용하면 View 로직이 매우 간결하게 정리된다.

URL 작성

django_practice/urls.py

from django.contrib import admin
from django.urls import include, path
from rest_framework import routers

from api import views

router = routers.DefaultRouter()
router.register(r"users", views.UserViewSet)
router.register(r"groups", views.GroupViewSet)
urlpatterns = [
    path("polls/", include("polls.urls")),
    path("admin/", admin.site.urls),
    path("", include(router.urls)),
    path("api-auth/",
         include("rest_framework.urls", namespace="rest_framework")),
]

Settings

django_practice/settins.py

# ...
INSTALLED_APPS = [
    # ...
    "rest_framework",
]

Test

서버 실행

(django-practice-py3.12) $ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
March 21, 2024 - 09:04:21
Django version 5.0.3, using settings 'django_practice.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

API 호출 테스트

$ curl -u pacho -H 'Accept: application/json; indent=4' http://localhost:8000/users/
Enter host password for user 'pacho':
[
    {
        "url": "http://localhost:8000/users/1/",
        "username": "pacho",
        "email": "pacho@example.com",
        "groups": []
    }
]

끝.

728x90

'Programming > Python' 카테고리의 다른 글

Python Web Server Gateway Interface(WSGI)  (0) 2024.05.27
Django 5.0.x에서 psycopg3 사용하기(feat. 삽질)  (0) 2024.04.05
django(4)-admin site  (0) 2024.03.20
django(3)-database API  (0) 2024.03.20
django(2)-app 만들기  (0) 2024.03.18