สร้าง API แบบติดจรวดด้วย Django REST Framework

สร้าง RESTful API ง่ายมากโดยใช้ Django

หลาย ๆ คนอาจเคยได้ยินเกี่ยวกับ REST framework ของ Django กันมาบ้างแล้วแต่ไม่มีโอกาสได้ทำความรู้จักสักทีวันนี้ผมจะพามารู้จักกับเจ้าตัว REST framework ครับอย่างแรกเราก็ควรเข้าใจก่อนใช่ไหมครับว่ามันใช้ทำอะไร

What is REST

อธิบายแบบง่าย ๆ นะครับในตัวของ REST มันจะช่วยเราสร้าง Web Service โดยใช้เทคโนโลยี Web Protocol เพื่อที่ติดต่อแลกเปลี่ยนข้อมูลกันระหว่าง Server กับ Client ซึ่งเราจะใช้สถาปัตยกรรมนี้ละไปสร้างสิ่งที่เรียกว่า RESTful API ที่ช่วยให้เราล้วงเอา response กลับมาเป็น Payload รูปแบบ JSON, XML หรือ format อื่น ๆ โดยเราจะสั่ง API ผ่าน Method ต่าง ๆ เช่น GET, POST, PUT, DELETE etc. สิ่งที่ผมอธิบายยังไม่ระเอียดเท่าไหร่นะครับสามารถหารายระเอียดเพิ่มเติมได้ครับผมสำหรับคนที่ยังไม่เข้าใจตรงนี้

แล้ว Django REST framework (DRF) ทำไมถึงดี

  1. ใช้งานได้ง่ายเพราะเป็น Python ไงละ
  2. มี document ที่ดีอ่านง่ายเข้าใจง่าย
  3. ปรับแต่งง่ายสะดวก code จัดเรียงได้มีระเบียบ
  4. เร็วต่อการพัฒนา Website
  5. มีการจัดการข้อมูลโดยใช้ serializer ซึ่งทำให้ง่ายต่อการจัดการข้อมูลเป็นอย่างมาก
  6. มีคนใช้เยอะทำให้ง่ายต่อการแก้ปัญหาต่าง ๆ

สร้าง API เสร็จภายใน 6 ขั้นตอน

  1. ตั้งค่า Project
  2. สร้าง Model เพิ่มลงใน Database
  3. ตั้งค่า Django REST Framework
  4. สร้าง Serialize ให้กับ model
  5. สร้าง View
  6. Set up URL

1. ตั้งค่า Project

โดยเราต้องสร้าง Django app, และ Migrate Database ในโปรเจกต์ของเรา อย่างแรกเลยอยากให้ทุกคนสร้าง virtual environment เพื่อเอามาใช้ในโปรเจกต์ของเราก่อน

1.1 สร้าง Virtual environment

วิธีที่ผมใช้ก็คือการติดตั้งผ่าน Python โดยสั่งผ่าน Command line ด้วยคำสั่ง

python -m venv env

เราจะได้ไฟล์ที่ชื่อว่า env ซึ่งันจะเป็นไฟล์ที่เป็น virtual environment ของโปรเจกต์เราสำหรับใครต้องการอ่านเพิ่มเติมเกี่ยวกับการสร้าง virtual environment สามารถอ่านเพิ่มเติมได้ ตรงนี้เลย โอเคไปต่อกันเราจะทำการ set up project กันต่อแต่เราต้อง activate ไฟล์ env ของเราก่อนเพื่อที่จะใช้งาน virtual environment ทำได้โดยการใช้ command line สั่งให้ activate โดยเราจะต้องเข้าไปที่ไฟล์
env -> Scripts -> activate

C:\myproject> .\env\Scripts\activate

เมื่อเรา activate สำเร็จจะมีคำว่า (env) ขึ้นอยู่ข้างหน้าแบบนี้

อย่าลืม activate env ทุกครั้งเมื่อเริ่มทำโปรเจกต์

1.2 ติดตั้ง Django ได้เลย

เราจะติดตั้ง Django ลงในไฟล์ env ของเราโดยใช้ pip

pip install django

แล้วก็สร้างโปรเจกต์ใหม่ได้ด้วยคำสั่ง

django-admin startproject mysite

เรามาทดลองรันโปรเจกต์กันก่อนดีกว่าโดยเราจะต้องเข้าไปในโปรเจกต์เราก่อนแล้วเข้าไปใช้ manage.py ในโปรเจกต์ของเราด้วยคำสั่ง

cd mysite //เข้าไปในโฟลเดอร์โปรเจกต์ของเรา
python manage.py runserver //Run server โปรเจกต์

โปรเจกต์ของเราจะรันผ่าน http://localhost:8000/ สามารถเข้าไปดูได้จะเห็นแบบนี้

Hello Django site

1.3 สร้าง App เพื่อที่จะมาเป็น API

เพื่อที่จะสร้าง App API เราจำเป็นต้องสร้าง App เข้ามาในโปรเจกต์ของเราโดยเราจะแยกการทำงานให้เข้าใจง่ายในการพัฒนาระบบมากที่สุดเราควรที่จะแยกการทำงานต่าง ๆ ให้เป็นสัดส่วนโดยการสร้าง App ขึ้นมาใหม่โดยใช้คำสั่ง

python manage.py startapp myapi

เราจำเป็นต้องเพิ่ม App ใหม่ที่เราสร้างลงในโปรเจกต์ของเราด้วยโดยที่เราต้องไปเพิ่มที่ไฟล์ settings.py ในโฟลเดอร์โปรเจกต์หลักในที่นี้คือ mysite/settings.py โดยเข้าไปเพิ่มที่

INSTALLED_APPS = [
..., //app ต่างๆที่ติดตั้งไว้อยู่แล้ว
'myapi' //เพิ่ม app เราตรงนี้
]

1.4 Migrate database & สร้าง superuser

ก่อนที่เราจะไปสร้าง superuser ได้เราต้องทำการ migrate เพื่อให้ Django ไปสร้างตารางให้เราใน database ซึ่งตาราง user นี้จะเป็นตารางพื้นฐานที่มีอยู่แล้วใน Django เราแค่ทำการ migrate ก็สามารถสร้าง database ได้แล้วโดย DBMS ที่เราใช้เป็นตัวที่ Django ตั้งค่ามาให้คือ SQLite

เราเริ่ม migrate กันดีกว่าด้วยคำสั่ง :

python manage.py migrate

เมื่อเรา migrate เสร็จแล้วเราสามารถที่จะดู Database เราผ่านทาง http://localhost:8000/admin/ ได้แต่เราจำเป็นต้องมี superuser ก่อนเราสามารถสร้างได้โดยใช้คำสั่ง

python .\manage.py createsuperuser

เข้าไปที่ http://localhost:8000/admin/ แล้ว Login ได้เลยจร้า

เมื่อเรา login เข้าไปก็จะเจอหน้ารวม Database ของโปรเจกต์เราสามารถจัดการเกี่ยวกับ Database ได้โดยผ่านหน้านี้

Site administration

2. สร้าง Model เพิ่มลงใน Database

เราจะสร้าง Model ที่ไฟล์ myapi/models.py

2.1 สร้าง Model

เราจะสร้าง Model Rapper กันครับซึ่ง Rapper แต่ละคนก็จะมีชื่อและ AKA ต่างกันใช่ซึ่งเราจะเก็บอยู่ในรูปแบบตัวอักษรมาเริ่มสร้างกันเลยดีกว่า

# models.py
from django.db import models
class Rapper(models.Model):
name = models.CharField(max_length=100)
aka = models.CharField(max_length=60)
def __str__(self):
return self.aka

** เพิ่ม __str__ method เพื่อช่วยในการแสดงผลในหน้า admin ตัวนี้เป็นตัวบอก Django ว่าให้แสดงผลยังไงเมื่อเรียกดู model นี้

ด้านบนคือก็เพิ่ม model ลงในโปรเจกต์ของเราแต่ยังไม่ได้ส่งขึ้น Database ซึ่งเราพิมคำสั่งผ่านทาง command line สองคำสั่งเพื่อที่จะนำ model นี้ขึ้นไปอยู่บนเซิฟของเรานั้นก็คือ makemigrations และ migrate

# คำสั่งแรก
python .\manage.py makemigrations
# คำสั่งที่สอง
python .\manage.py migrate

เท่านี้ model ก็ขึ้นไปอยู่ใน database ของเราแล้วครับแต่มันยังคงไม่เห็นในหน้า admin เราต้องไป Register ก่อนถึงจะสามารเห็น model ได้

2.2 Register model

ไปที่ไฟล์ myapi/admin.py เพิ่มโค้ดลงในไฟล์ดังนี้

from django.contrib import admin
from .models import Rapper
admin.site.register(Rapper)

เพื่อทำการอ้างถึง models Rapper ต้องทำการ Import จากไฟล์ models เข้ามาก่อนเพื่อนำมา register ใน admin site เพียงเท่านี้เราก็สามารถเห็น models ของเราใน database แล้วครับมาลองรันเซิฟกันดีกว่า

python manage.py runserver

แล้วไปที่ http://localhost:8000/admin แล้วก็ login เราจะเห็น Rapper ดังภาพ

Rappers is now

2.3 เพิ่ม Rappers ลงใน Database

เมื่อเราจะทดลองยิง API เราจำเป็นต้องมีข้อมูลอยู่ใน database บ้างซึ่งเราสามารถเพิ่มได้เองเลยโดยใช้หน้า admin นี้โดยกด Add แล้วก็กรอก name, aka กด save เท่านี้ก็สามารถเพิ่มข้อมูลลงใน database โดยเราเพิ่มกันสัก 4–5 คนก็พอ

3. ตั้งค่า Django REST Framework

หลังจากเพิ่มส่วนประกอบต่าง ๆ มากมายได้เวลาพระเอกของเราในบทความนี้แล้วครับก็คือ Django REST Framework นั้นละอย่างแรกที่จะใช้พระเอกเราได้ต้อง Install ก่อนโดยเราก็สามารถ install ได้ง่าย ๆ โดยใช้คำสั่งดังนี้

pip install djangorestframework

หลังจาก Install เสร็จแล้วเราต้องทำให้โปรเจกต์เรารู้จัก Django REST Framework ด้วยโดยที่เราจะไปหน้า mysite/setting.py และเพิ่ม rest_framework เข้าไป

INSTALLED_APPS = [
..., # app ต่างๆที่ติดตั้งไว้อยู่แล้ว
'rest_framework' # ติดตั้ง rest_framework ตรงนี้
]

4. สร้าง Serialize ให้กับ model

serialize เป็นอีกหนึ่งตัวที่ทำให้ Django REST Framework เป็นหนึ่งใน Library ที่ดีมาก ๆ ซึ่งวันนี้เราจะไม่ได้ลงรายระเอียดลึกมากไว้จะเขียนแยกอีกบทความ

อย่างแรกเราต้องสร้างไฟล์ใหม่ serializers.py ข้างในโฟลเดอร์ myapi และเพิ่มโค้ดเข้าไปในไฟล์ตามนี้เลย

# myapi/serializers.py
from rest_framework import serializers
from .models import Rapper
class RapperSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Rapper
fields = ('name', 'aka')

เราต้อง import 2 ตัวคือ

  1. Serializers จาก rest_framework
  2. Rapper จาก models ที่เราได้สร้างไว้ภายใน myapi
  3. สร้าง class เพื่อเชื่อมกันระหว่าง models กับ serializer

5. สร้าง View

เราจะดึงข้อมูลใน database มาแสดงผลในรูปแบบ JSON format และก็จะทำให้เราสามารถเพิ่มข้อมูลได้ด้วยโดยจะไปเชื่อมกับ Serializer

เพิ่มโค้ดใน myapi/views.py

# views.py
from rest_framework import viewsets
from .serializers import RapperSerializer
from .models import Rapper
class RapperViewSet(viewsets.ModelViewSet):
queryset = Rapper.objects.all().order_by('aka')
serializer_class = RapperSerializer

เราจะใช้ viewsets ของ REST framework ในการช่วยเรื่องของการแสดงผลให้ดูง่ายซึ่งในโค้ดนี้เราจะเรียกดูข้อมูลจาก Rapper โดยเรียงลำดับจาก aka ของแต่ละคน และเชื่อมกับ RapperSerializer มาเพื่อทำให้เราสามารถนำข้อมูลใน database มาแสดงผลเป็นในรูปแบบของ JSON format ได้

6. ตั้งค่า URL

อย่างแรกเลยเราต้องเปลี่ยน path ในหน้าแรกให้ชี้ไปหา myapi โดยการที่เราจะทำการ include ไฟล์เข้ามาโดยตรงเลย

เราจะแก้ไขไฟล์ mysite/urls.py :

from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapi.urls')),
]

ในตอนนี้เนี้ยเราทำให้หน้า index เชื่อมต่อไปยัง myapi app แล้วว่าให้ไปเรียกไฟล์ myapi.urls มาแสดงผลแต่เรายังไม่มีการแก้ไขอะไรในหน้า urls.py ใน myapi เลยทำให้ Django ไม่รู้ว่าเราต้องการแสดงผลอะไรในหน้านี้เพราะฉะนั้นเราต้องไปแก้ไขไฟล์ myapi/urls.py เสียก่อนโดยเราจะให้แสดงหน้า view ที่เราได้ทำการปรับแต่งไปก่อนหน้าในรูปแบบ JSON ซึ่งเราจะนำตัว router ใน rest_framework มาใช้

myapi/urls.py :

from django.urls import include, path
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(r'rapper', views.RapperViewSet)
urlpatterns = [
path('', include(router.urls)),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

การใช้ router เข้ามาช่วยทำให้การแสดงผลของข้อมูลมีความถูกต้องตรงกับข้อมูลที่อยู่ใน database ซึ่งมันดีมาก ๆ เราไม่ต้องไป set up อะไรเยอะแยะด้วยแค่ register view ลงไปใน router และเรียกใช้ router.urls ก็สามารถดูข้อมูลที่อยู่ใน database ได้แล้ว

Run server ดูผลลัพท์กันดีกว่า

เริ่ม run server :

python manage.py runserver

ไปดูในหน้า index กันเลยดีกว่า http://localhost:8000/

api root vary cool

เราก็จะเห็นหน้าแรก สุดเรียบหรูซึ่งมันจะเป็นหน้ารวม api ของเราที่ได้ทำการ register เข้าไปใน router ซึ่งในที่นี้เรามีอยู่อันเดี่ยวก็คือ rapper เมื่อเรากดไปมันก็จะแสดงข้อมูลทั้งหมดที่อยู่ใน database

My Data in Rapper

นี้คือ Rapper List ที่เรา GET มาจาก Database ของเราซึ่งใน Database มีข้อมูลเท่าไหร่มันก็จะดึงมาทั้งหมดและแปลงเป็นให้อยู่ในรูปแบบของ JSON ด้วยดูสะดวกไปอีก

ส่ง POST เพื่อเพิ่มข้อมูลใน Database

แล้วถ้าเราเลื่อนลงมาข้างล่างก็จะมีช่องให้ใส่เพื่อที่จะเพิ่มข้อมูลลงใน database แบบ easy easy ดังภาพ

Post API

เพียงเท่านี้เราก็สามารถสร้าง API ได้แล้วครับและยังสามารถทดลองยิง method ต่างๆผ่านทาง API ของเราได้ด้วยไม่ว่าจะเป็น GET หรือ POST ซึ่งทำให้ง่ายต่อการ dev และ debug ต่างๆ มากเลยเพราะเราจะเห็นว่าต้องส่งอะไรไปบ้าง ส่งเสร็จแล้วจะมีข้อมูลอะไร response กลับมาบ้างเราสามารถใช้ตัวนี้ทดสอบได้แทบทุกอย่างเลยสะดวกมากๆ สำหรับเจ้าตัว Django REST Framework

จบแล้วสำหรับการสร้าง API ด้วย Django REST Framework

บทความนี้ค่อนข้างใช้เวลาเยอะกว่าที่คิดยังไงถ้ามีตรงไหนสงสัยหรือไม่เข้าใจก็สามารถที่จะคอมเม้นถามได้นะครับในท้ายที่สุดนี้หวังว่าบทความนี้จะมีประโยชน์ในการช่วยเรื่องการเรียนรู้เกี่ยวกับ Django REST Framework นะครับ

ขอบคุณทุกคนมากครับที่อ่านจนจบยังไงก็ช่วยกัน Clap เพื่อเป็นกำลังใจด้วยนะครับและสามารถติดตามบทความอีกมากมายได้ที่ stackpython นะครับอย่าลืมกดติดตามทั้งใน Medium และก็ Facebook ด้วยน๊าาาาาาาา

ท่านสามารถติดตามพวกเราได้ที่ stackpython ตามช่องทางด้านล่างนี้ได้เลยครับ

Instagram: stackpython

Facebook: stackpython

Website: stackpython.co

YouTube: stackpython

Full Stack Python Developers