이제 웹통신을 할 장고 API를 설정해보겠습니다.

django쪽 디렉터리에서 앱을 하나 생성해줍니다.

$ (venv) python manage.py startapp notes

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # notes 앱 추가
    'notes',
]

일단, REST Framework를 사용할 것이기 때문에 먼저 인스톨부터 하죠.

$ (venv) pip install djangorestframework

그런뒤 마찬가지로 INSTALLED_APPS 에 추가합니다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # notes 앱 추가
    'notes',
    # rest framework 추가
    'rest_framework',
]

저희가 notes 앱 에서 쓸 파일들은 다음과 같습니다.

urls.py: API 라우팅

models.py: 모델

serializers.py: 모델을 참조하여 serializing

views.py: 실제 일을 하는 곳. serializer 참조.

일단 models.py 에서 모델을 생성해야합니다.

notes/models.py

from django.db import models

class Notes(models.Model):
    text = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now=False, auto_now_add=True)

    def __str__(self):
        return self.text

한줄 노트가 들어갈 text필드와 만들어진 날짜를 구분하는 created_at필드를 가진 Notes모델을 생성했습니다.

항상 모델을 등록한후에는 migration을 해주어야 합니다.

$ (venv) python manage.py makemigrations
$ (venv) python manage.py migrate

serializer를 생성하겠습니다.

notes/serializers.py

from rest_framework import serializers
from .models import Notes


class NoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Notes
        fields = ("id", "text")

다음과 같이 Note 모델을 시리얼라이징 해주는 시리얼라이저를 생성했습니다.

그리고 views.py에서 ViewSet을 하나 만든 후 urls.py에서 라우팅 해주겠습니다.

notes/views.py

from rest_framework import viewsets
from .serializers import NoteSerializer
from .models import Notes


class NoteViewSet(viewsets.ModelViewSet):
    serializer_class = NoteSerializer

    def get_queryset(self):
        return Notes.objects.all().order_by("-created_at")

    def perform_create(self, serializer):
        serializer.save()

notes/urls.py

from django.conf.urls import url
from .views import NoteViewSet

note_list = NoteViewSet.as_view({"get": "list", "post": "create"})

note_detail = NoteViewSet.as_view(
    {"get": "retrieve", "patch": "partial_update", "delete": "destroy"}
)


urlpatterns = [
    url("^notes/$", note_list, name="note-list"),
    url("^notes/(?P<pk>[0-9]+)/$", note_detail, name="note-detail"),
]

그 다음 root앱의 urls.py에서 notes의 urls.py를 반영해줍니다.

urls.py

from django.contrib import admin
from django.urls import path

from notes import urls
from django.conf.urls import include, url

urlpatterns = [
    path("admin/", admin.site.urls), 
    url(r"^api/", include(urls))
]

이제 다음의 url들이 통신이 될것입니다.

http://localhost:8000/api/notes/ (GET - Note List)
http://localhost:8000/api/notes/ (POST - Create Note)
http://localhost:8000/api/notes/{id}/ (GET - Get Single Note by id)
http://localhost:8000/api/notes/{id}/ (PATCH - update partial)
http://localhost:8000/api/notes/{id}/ (DELETE - destroy a single note by id)

일단 권한 설정을 하지 않았습니다.
지금까지 만들어놓은 API를 가지고 react에서 반영해보겠습니다.