# Django Rest Framework?
# ๐งฑPreference
Windows10
python 3.7 ์ด์
Git Bash
Django ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋
HTTP Method
์์ ์ค๋ช ํ REST์ ์ฅ์ ๊ณผ ํ์์ฑ์ ์ด๋์ ๋ ์ดํดํ์์ผ๋ฉด, ์ค์ ๋ก ์ฌ์ฉํด๋ณด์์ผ๊ฒ ์ฃ .
# 1. DRF(Django Rest Framework)๋?
Django ์์์ RESTful API ์๋ฒ๋ฅผ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์๋๋ก ๋์์ฃผ๋ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
๊ณต์๋ฌธ์์์ ์ค๋ช ํ๋ Django REST Framework๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ์๋์ ๊ฐ๋ค.
- ์น ๋ธ๋ผ์ฐ์ API๋ ๊ฐ๋ฐ์์๊ฒ ํฐ ์ฌ์ฉ์ฑ์ ์ฆ ๊ฐ๋ฐ์ ์ฝ๊ฒ ๋ง๋ค์ด ์ค๋ค.
- ์ธ์ฆ ์ ์ฑ ์ OAuth1, OAuth2๋ฅผ ์ํ ์ถ๊ฐ์ ์ธ ํจํค์ง๊ฐ ์ถ๊ฐ ๋์ด ์๋ ๊ฒฝ์ฐ
- ์๋ฆฌ์ผ๋ผ์ด์ฆ ๊ธฐ๋ฅ์ ์ ๊ณต์ ํด์ค๋ค. (DB data -> JSON)
- ๋ฌธ์ํ ๋ฐ ์ปค๋ฎค๋ํฐ ์ง์์ด ์ ๋์ด์๋ค.
# 2. Django ๊ธฐ๋ณธ app ๋ง๋ค๊ธฐ
DRF๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ด์ ์ธ์ ์ ๋ด์ฉ์ ์ฐธ๊ณ ํด์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด๋ด ์๋ค.
rest_tutorial
โโโ api
โ โโโ __init__.py
โ โโโ admin.py
โ โโโ apps.py
โ โโโ migrations
โ โ โโโ __init__.py
โ โโโ models.py
โ โโโ tests.py
โ โโโ urls.py
โ โโโ views.py
โโโ db.sqlite3
โโโ manage.py
โโโ tutorial
โโโ __init__.py
โโโ settings.py
โโโ urls.py
โโโ wsgi.py
$ python -m venv myvenv # ๊ฐ์ํ๊ฒฝ ์์ฑ
$ source myvenv/scripts/activate # ๊ฐ์ํ๊ฒฝ ์คํ
$ pip install django # django ์ค์น
$ django-admin startproject tutorial #ํ๋ก์ ํธ ์์ฑ
$ python manage.py startapp api # app ์์ฑ
# โน 2.1 app ๊ธฐ๋ณธ mapping
์ด์ ์ธ์ ์์ ํ๋ ๋ด์ฉ๊ณผ ๊ฑฐ์ ๋์ผํ๊ธฐ ๋๋ฌธ์ ์ฐธ๊ณ ํ์๋ ค๋ฉด ์๋ ๋ฒํผ์ ๋๋ฌ์ ๋ณด์๋ฉด ๋ฉ๋๋ค.
โ ๊ธฐ๋ณธ ์ค์ ์ดํด๋ณด๊ธฐ
# 2.1.1. settings.py ์ค์
rest_tutorial/tutorial/settings.py
INSTALL_APPS = [
...
'api', # add
]
# 2.1.2 views.py ์ค์
rest_tutorial/api/views.py
from django.shortcuts import render
from django.http import HttpResponse
def hello(request):
return HttpResponse("<h1>Hello, world!</h1>")
# 2.1.3 urls.py ์ค์
rest_tutorial/tutorial/urls.py
from django.contrib import admin
from django.urls import path
import api.views # views.py ์ ์์ฑํ hello ํจ์ ๋ถ๋ฌ์ค๊ธฐ
urlpatterns = [
path('admin/', admin.site.urls),
path('', api.views.hello, name="hello"),
]
# 2.1.4 Model ์์ฑ
rest_tutorial/api/models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
body = models.TextField()
def __str__(self):
return self.title
Migration
$ python manage.py makemigrations
$ python manage.py migrate
# 2.1.5 Admin ์์ฑ
$ python manage.py createsuperuser
# 2.1.6 Admin์ model ๋ฑ๋ก
rest_tutorial/api/admin.py
from django.contrib import admin
from .models import Post
admin.site.register(Post)
๊ธฐ๋ณธ์ ์ธ Setting์ ์ด์ ๋๋ง ํด๋ ์ข์ต๋๋ค.
# 3. Django Rest Framework ์ค์น
Python ๊ฐ์ํ๊ฒฝ์ ์คํ์์ผ์ฃผ๊ณ pip
๋ก ๊ฐ๋จํ๊ฒ ์ค์นํด์ค ์ ์์ต๋๋ค.
pip install djangorestframework
# โน 3.1 setting.py ์ค์ ์ ์ถ๊ฐํ๊ธฐ
rest_tutorial/tutorial/settings.py
INSTALL_APPS = [
...
'api',
'rest_framework', # add
]
# 4. DRF์ ํต์ฌ ๊ธฐ๋ฅ - Serializer ๋
์ง๋ ํฌ์คํ
์์ ์์๋ณธ Web์ด ์๋ Android App๊ณผ ๊ฐ์ ๋ฉํฐ ํ๋ซํผ์ ์ ๋ถ ํ๋์ back-end
์์ ์ฒ๋ฆฌํ ์ ์๋ REST์ ์ฅ์ ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ค๋ฉด JSON
๋ฑ์ ๋ฐ์ดํฐ ํ์์ ์ฌ์ฉํ๋๊ฒ ์ข๋ค๊ณ ํ์์ฃ !
Serializer๊ฐ queryset
๊ณผ ๋ชจ๋ธ ์ธ์คํด์ค
์ ๊ฐ์ ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ JSON
, XML
๋๋ ๋ค๋ฅธ ์ฝํ
์ธ ์ ํ์ผ๋ก ์ฝ๊ฒ ๋ณํํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ฐ์ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ ๋ค์, ๋ณต์กํ ํ์
์ผ๋ก ํ ๋ณํํ ์ ์๋๋ก serializeation
์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค.
๋ฌผ๋ก SErializer๋ฅผ ํตํด ๋ชจ๋ธ ์ธ์คํด์ค๊ฐ JSON ๋๋ Dictionary ํํ๋ก
์ง๋ ฌํ
๋๋ฉด ์ข์ ์ ์ ๋ ๋ง์ต๋๋ค!
# โน 4.1 serializers.py ์์ฑ
api ํด๋ ์๋์ ๋ค์ python ํ์ผ์ ์ถ๊ฐํด์ฃผ์ธ์.
rest_tutorial/api/serializers.py
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post # ๋ชจ๋ธ ์ค์
fields = ('id', 'title', 'pub_date', 'body') # ํ๋ ์ค์
# โน 4.2 views.py ์์ฑ
DRF๋ ๋ณดํต ์ฌ๋๋ค์ด ์์ฃผ ์ฌ์ฉํ๋ ๊ณตํต์ ์ธ view ๋ก์ง์ ๊ทธ๋ฃนํ ํ viewset
์ ์ ๊ณตํฉ๋๋ค.
viewset
์ ์ฌ์ฉํ๊ฒ ๋๋ฉด CRUD ๋ก์ง์ ์ง์ ์ง์ง ์์๋ ์ด ๊ธฐ๋ฅ๋ค์ด ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋๋ค.
์๋ฌด์ฝํ ํ์ง ์์๋ CRUD ๊ธฐ๋ฅ์ด ๋ค ๋๋ค๋ ๊ฑฐ์ฃ !
rest_tutorial/api/views.py
from rest_framework import viewsets
from .serializers import ApiSerializer
from .models import Post
class ApiViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = ApiSerializer
# โน 4.3 urls.py ์์ฑ
DRF๋ url์ ์๋์ผ๋ก ๋งตํํด์ฃผ๋ router๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์ ์์ฑํ viewset์ router์ ์ฐ๊ฒฐํ๊ฒ ๋๋ฉด ์๋์ผ๋ก url์ ๋งตํํด์ฃผ์ด ์ฌ์ฉ์๊ฐ ์ง์ url์ ๋งตํํ์ง ์์๋ ๋ฉ๋๋ค.
from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from api import views
router = routers.DefaultRouter()
router.register(r'posts', views.PostViewSet)
# prefix = posts, viewSet = PostViewSet
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
]
์์์ router.register๋ก prefix๋ฅผ 'posts'๋ก ์ค์ ์ ํด์ฃผ์์ต๋๋ค.
router๋ ์ด๋ฅผ ๋ฐํ์ผ๋ก url์ ๋งตํํ๊ฒ ๋ฉ๋๋ค.
URL pattern: ^posts/$ Name: 'post-list'
# 5. ์คํํ๊ธฐ
$ python manage.py runserver
# โน 5.1 ์์ฑ!
๋ง๋ api
๋ก CRUD
์์ฒญ์ ํด๋ด
์๋ค.
api ์์ฒญ uri๊ณผ method๋ฅผ ์ ๋ฆฌํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
GET /posts/
: ๊ฒ์๊ธ ๋ฆฌ์คํธ ์กฐํ
POST /posts/
: ๊ฒ์๊ธ ์ถ๊ฐ
PUT /posts/
: ๊ฒ์๊ธ ์์
DELETE /posts/
: ๊ฒ์๊ธ ์ญ์
๋จผ์ localhost:8000
์ผ๋ก ๋ค์ด๊ฐ๊ฒ ๋๋ฉด ํด๋น ํ๋ฉด์ด ๋ณด์ผ ๊ฑฐ์์.
posts ๋งํฌ๋ก ๋ค์ด๊ฐ๋ด ์๋ค.
GET /posts/
๋ ๊ฒ์๊ธ ๋ฆฌ์คํธ๋ฅผ ์์ฒญํ๋ uri์ด๋ค.
์๋ form
์ผ๋ก ๊ฒ์๊ธ ์ ๋ณด๋ฅผ ์
๋ ฅํด๋ณด์ธ์.
์
๋ ฅ ํ๊ณ post
๋ฒํผ์ ๋๋ฅด๋ฉด POST ๋ฉ์๋๋ก /posts/
uri์ ์์ฒญ์ด ๊ฐ๊ณ , ํด๋น ์ ๋ณด๊ฐ ์ ์ฅ๋ฉ๋๋ค.
๋๋จธ์ง ๊ธฐ๋ฅ๋ ํ๋ฒ ํ ์คํธ ํด๋ณด์ธ์!
DRF๋ ๋์ฑ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์ปค์คํ ํ ์ ์๊ฒ ์ ๊ณต๋๋๊น ํ๋ก์ ํธ๋ฅผ ์งํํ ๋ ํ์ฉํ๋ฉด ๋์ฑ ํธ๋ฆฌํ๊ฒ ๋ง๋ค ์ ์๊ฒ ์ฃ !
# Reference
- https://jamanbbo.tistory.com/43
- https://www.django-rest-framework.org/tutorial/quickstart/