Django RESTful API

JIYEONG YUN·2021년 9월 7일
0

0. 사전준비

  1. Django를 사용하기 위해서는 Python이 설치되어 있어야 한다. Python 3.4 이상 버전을 설치
[~] → python3 --version
Python 3.6.5
[~] → pip3 --version
pip 10.0.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)
  1. pip를 이용해 virtualenv를 설치
[~] → pip3 install virtualenv
(installing)
[~] → virtualenv --version
16.0.0

1. 프로젝트 생성

| Django REST Framework 설치

(devenv)
→ pip install djangorestframework

| settings.py의 INSTALLED_APPSrest_framework 추가하기

  • 프로젝트 생성하면서 같이 생성한 api앱도 같이 추가
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'api',
]

| Model 생성

  • 예제를 위해 이전에 사용했던 Post 모델 가져다 씀
# api/models.py
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=144)
    subtitle = models.CharField(max_length=144, blank=True)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return '[{}] {}'.format(self.user.username, self.title)

| Serializers 생성

기존 Django를 이용한 웹 개발에서 Django ORM의 Queryset은 Django template로 넘겨지며 HTML로 렌더링 되어 Response로 보내지게 된다. 하지만 RESTful API는 JSON으로 데이터를 보내야하기 때문에 HTML로 렌더링되는 Django template를 사용할 수 없다.

그래서 Queryset을 Nested한 JSON으로 매핑하는 과정을 거쳐야하는데, 이 작업을 Serializer가 하게 된다.

Serializer 작성

  • Django REST framework에서 제공하는 ModelSerializer 사용하기
  • api에 serializers.py 생성
# api/serializers.py
from rest_framework import serializers
from .models import Post
from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email')

class PostSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True)
    class Meta:
        model = Post
        fields = (
            'id',
            'title',
            'subtitle',
            'content',
            'created_at',
        )
        read_only_fields = ('created_at',)

| Views 생성하기

  • View의 역할
    • Queryset을 컨트롤하고 데이터를 조작해 Serializer을 통해 매핑 시켜줌
  • CBV를 이용하여 여러 개의 뷰를 한 번에 작성하지 않고 Viewset을 이용해 Model 하나의 컨트롤하는 CRUD를 1개의 View로 구현할 예정
# api/views.py
from rest_framework import viewsets
from .serializers import PostSerializer
from .models import Post
from rest_framework import permissions

class PostView(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = (permissions.IsAuthenticated,)
    def perform_create(self, serializer):
        serializer.save(user=self.request.user)
  • URL 매핑
    • CRUD는 크게 2가지 URL 패턴으로 분리되기 때문에 각각 따로 매핑 시켜줘야 함.
# api/urls.py
from django.urls import path, include
from rest_framework.urlpatterns import format_suffix_patterns
from .views import PostView
post_list = PostView.as_view({
    'post': 'create',
    'get': 'list'
})
post_detail = PostView.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('posts/', post_list, name='post_list'),
    path('posts/<int:pk>/', post_detail, name='post_detail'),
])
  • 다시 루트 URL에 매핑
# tutorial/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('api.urls')),
]

| Migration 생성 후 실행

(devenv)
→ python manage.py makemigrations
(devenv)
→ python manage.py migrate
(devenv)
→ python manage.py createsuperuser
(devenv)
→ python manage.py runserver

| 실행

localhost:8000/api/posts/1/
profile
나의 '개발'자국 🐾 | [이전 블로그] https://blog.naver.com/yoonjy1106

0개의 댓글