๐ฉ Django REST framework๋ฅผ ์ด์ฉํด RESTful API๋ฅผ ํด๋ณด์๋ค.
์ฐ์ ๊ฐ์ํ๊ฒฝ์ ์ค์ ํ๊ณ ๊ธฐ๋ณธ์ ์ธ Django ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค.
๊ฐ์ํ๊ฒฝ venv๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด python์ด 3.x ๋ฒ์ ์ด์์ด์ด์ผ ํ๋ค.
python 2.x ๋ฒ์ ์์๋ ๊ฐ์ํ๊ฒฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋์ง ์์๊ธฐ ๋๋ฌธ์ virtualenv ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
ํด๋๋ฅผ ๋ง๋ค์ด ์ฃผ๊ณ ๊ทธ ํด๋ ์์์ python -m venv ๊ฐ์ํ๊ฒฝ์ด๋ฆ
์จ์ฃผ๋ฉด ๋๋ค. dev_env ๊ฐ์ํ๊ฒฝ์ด๋ฆ์ ๋ง๋ ๋ค.
python -m venv dev_env //window
python3 -m venv dev_env //mac
ํด๋ ์์์ ๊ฐ์ํ๊ฒฝ์ด๋ฆ\Scripts\activate.bat
์ด๋ผ๊ณ ์ณ์ฃผ๋ฉด ๊ฐ์ํ๊ฒฝ์ด ํ์ฑํ๋๋ค.
dev_env\Scripts\activate //window
source dev_env/bin/activate //mac
๊ฐ์ํ๊ฒฝ ์์ Django, REST framework ์ค์นํ๋ค.
(dev_env) pip install django //Django ์ค์น
(dev_env) pip install djangorestframework //REST framework ์ค์น
์ฅ๊ณ ์ค์น๊ฐ ์๋ฃ๋์์ผ๋ฉด django-admin startproject ํ๋ก์ ํธ์ด๋ฆ
๋ช
๋ น์ด๋ก ์ฅ๊ณ ํ๋ก์ ํธ๋ฅผ ์์ํ๋ค. ls ๋ช
๋ น์ด(์๋์ฐ : dir)๋ก ํ์ธ์ ํด๋ณด๋ฉด start_django๋ผ๋ ํด๋๊ฐ ์๊ธด๊ฒ์ ํ์ธ ํ ์ ์๋ค.
django-admin startproject start_django //ํ๋ก์ ํธ ๋ง๋ค๊ธฐ
Django REST framework๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ settings.py INSTALLED_APPS ์ โrest_frameworkโ๋ฅผ ์ถ๊ฐํด ์ค๋ค. ํ๋ก์ ํธ ์์ฑํ๋ฉด์ ๊ฐ์ด ์์ฑํ โproductโ ์ฑ๋ ๊ฐ์ด ์ถ๊ฐํ๊ธฐ๐
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'rest_framework',
'product',
]
start_django/Product/models.py ๋ชจ๋ธ ์์ฑํ๊ธฐ
from django.db import models
# Create your models here.
class Product(models.Model):
name = models.CharField(max_length=256, verbose_name='์ํ๋ช
')
price = models.IntegerField(verbose_name='์ํ๊ฐ๊ฒฉ')
description = models.TextField(verbose_name='์ํ์ค๋ช
')
stock = models.IntegerField(verbose_name='์ฌ๊ณ ')
register_date = models.DateTimeField(auto_now_add=True, verbose_name='๋ฑ๋ก๋ ์ง')
def __str__(self):
return self.name
class Meta:
db_table = 'fast_product'
verbose_name = '์ํ'
verbose_name_plural = '์ํ'
REST framework ์ฌ์ฉํ๊ธฐ ์ํด์๋ Serializers๋ฅผ ์์ฑํด์ผ ํ๋ค.
Django๋ฅผ ์ด์ฉํ ์น ๊ฐ๋ฐ์์ Django ORM์ Queryset์ Django template๋ก ๋๊ฒจ์ง๋ฉฐ HTML๋ก ๋ ๋๋ง ๋๋ค. ํ์ง๋ง Serializers๋ queryset๊ณผ ๋ชจ๋ธ ์ธ์คํด์ค์ ๊ฐ์ ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ JSON, XML ๋๋ ๋ค๋ฅธ ์ฝํ
์ธ ์ ํ์ผ๋ก ์ฝ๊ฒ ๋ณํ ํ ์ ์๋ค.
# ๊ธฐ์กด Django template
{% for product in product_list %}
<tr>
<th scope="row">{{ product.id }}</th>
<th>{{ product.name }}</th>
<th>{{ product.price|intcomma }} ์</th>
<th>{{ product.register_date|date:'Y-m-d H:i' }}</th>
</tr>
{% endfor %}
# JSON ๋ฐ์ดํฐ
{
"id": 2,
"name": "๋ฐ๋๋",
"price": 1000,
"description": "<p>๋ฐ๋๋์
๋๋ค</p>",
"stock": 100,
"register_date": "2021-01-16T07:13:17.886749Z"
}
Django REST framework๊ฐ ์ ๊ณตํ๋ ModelSerializer์ ์ฌ์ฉํ๋ค.
product์ serializers.py ํ์ผ์ ์์ฑํ๋ค.
# start_django/Product/serializers.py
from rest_framework import serializers
from .models import Product
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
View๋ ์ค์ง์ ์ผ๋ก Queryset์ ์ปจํธ๋กคํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํด Serializer์ ํตํด ๋งคํ์์ผ ์ค๋ค.
# start_django/Product/views.py
from rest_framework import generics
from rest_framework import mixins
from .models import Product
from .serializers import ProductSerializer
class ProductListAPI(generics.GenericAPIView, mixins.ListModelMixin):
serializer_class = ProductSerializer
def get_queryset(self):
return Product.objects.all().order_by('id')
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
class ProductDeatilAPI(generics.GenericAPIView, mixins.RetrieveModelMixin):
serializer_class = ProductSerializer
def get_queryset(self):
return Product.objects.all().order_by('id')
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
๋ง์ง๋ง์ผ๋ก url.py์ ๋งคํ ์์ผ์ค๋ค.
from django.contrib import admin
from product.views import ProductListAPI, ProductDeatilAPI
urlpatterns = [
path('admin/', admin.site.urls),
path('api/product/', ProductListAPI.as_view()),
path('api/product/<int:pk>/', ProductDeatilAPI.as_view())
]
Migration ์์ฑํ๊ณ Migrate ์คํํ๋ค.
๋ชจ๋ธ์ ์์ฑํ๊ณ Migration, Migrate ํ๊ณ ์ค๊ฐ์ ํํ์ด ํ์ธํ์๋ค.
(dev_env) python manage.py makemigrations
(dev_env) python manage.py migrate
(dev_env) python manage.py runserver
๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ๋ง๋ ์ฃผ์๋ก ํ์ธํ ์ ์๋ค.
ProductListAPI - http://127.0.0.1:8000/api/product/
ProductDeatilAPI - http://127.0.0.1:8000/api/product/2/
Django REST framework๊ฐ API ์กฐ์์ ๋๊ธฐ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํด์ฃผ๋ ํ์ด์ง์ด๋ค.