Giới thiệu Django REST framework

Giới Thiệu Django REST framework

Tổng quan

REST là viết tắt của REpresentational State Transfer (dịch nôn na là chuyển trạng thái đại diện) là một kiểu kiến trúc lập trình, nó định nghĩa các quy tắc để thiết kết các web service chú trọng vào tài nguyên hệ thống. Trong kiến trúc REST mọi thứ đều được coi là tài nguyên, chúng có thể là: tệp văn bản, ảnh, trang html, video, hoặc dữ liệu động… REST server cung cấp quyền truy cập vào các tài nguyên, REST client truy cập và thay đổi các tài nguyên đó. Ở đây các tài nguyên được định danh dựa vào URI, REST sử dụng một vài đại diện để biểu diễn các tài nguyên như văn bản, JSON, XML.

Nguồn: tổng quan về REST - viblo

Ảnh demo qua về REST web service:

alt text

Sau đây mình xin giới thiệu với các bạn một thư viện hỗ trợ rất tốt việc tạo ra một RESTful Web API cho ứng dụng Django(Python).

Chuẩn bị

Yêu cầu

  • Kiến thức python căn bản Python.org
  • Postman hoặc CURL
  • Python 3

Setup môi trường

Đầu tiên ta tạo ra 1 virtualenv để làm việc

$ virtualenv3 ~/restEnv
$ source ~/restEnv/bin/activate 

Tiếp theo là install Django và django-rest

$ pip install django   # pip install --pre django -> nếu muốn cài Django 2.0 cho nó máu.
$ pip install djangorestframework 
$ pip install markdown       # Markdown support for the browsable API.
$ pip install django-filter  # Filtering support 

Tiếp theo ta tạo ra một project django

$ django-admin startproject djangorest  -> tạo project
$ python manage.py startapp rest  -> tạo một app tên là rest
$ python manage.py migrate  -> khởi tạo dữ liệu ban đầu cho project

Ok rồi. ta run thử lên xem thế nào

$ python manage.py runserver  -> tạo một app tên là rest

Nếu được như ảnh bên dưới thì ta đã sẵn sàng để đến với bước tiếp theo.

alt text

Bỏ qua ORM, Template cũng như URL của Django. Ta sẽ đến ngay phần làm thế nào để tạo ra 1 REST API bởi vì nó gần như tách biệt với các phần khác của django.

Ta thêm app framework và rest vào settings.py.

INSTALLED_APPS = (
    ...
    'rest_framework',
    'rest'
)

Tạo Model và data

Tiếp theo ta sẽ tạo ra một API dùng rest Các thành phần của một API gồm có

  • Model -----> làm việc với database
  • Serializer -----> chuyển queryset hoặc model của django thành dạng dữ liệu dễ dàng render trên web hơn và ngược lại,Chuyển JSON/XML do client chuyển lên thành object để Django có để xử lý dễ dàng.
  • API: ----->Phần xử lý logic
  • Controllers: (có thể có hoặc ko)

Create một model mới tên là Post.

# rest/models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=120)
    content = models.TextField()
    draft = models.BooleanField(default=False)
    read_time = models.IntegerField(default=0)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    created = models.DateTimeField(auto_now=False, auto_now_add=True)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ["-created", "-updated"]

Tạo thay đổi trong database và apply thay đổi bằng lệnh

$ python manage.py makemigrations
$ python manage.py migrate

Add Post model vào admin để tạo data mẫu

# rest/admin.py
from django.contrib import admin
from rest.models import Post

admin.site.register(Post)

Ta tạo admin user

$ python manage.py createsuperuser

Sau khi tạo admin user. Chúng ta vào trong admin interface tại địa chỉ http://localhost:8000/admin/ và tạo một vài Post để có data khi test.

Sau khi có data ta sẽ viết REST API. Thường ta sẽ viết vào một file API riêng. nhưng ở đây vì project ko có gì đặc biệt nên ta viết luôn vào views.py cũng được 😃

Tạo API

file API cơ bản:

#rest/views.py
from rest_framework.generics import (
    ListCreateAPIView,
    RetrieveUpdateDestroyAPIView,)
from rest_framework import viewsets
from rest_framework.pagination import PageNumberPagination
from rest_framework.permissions import IsAuthenticated
from rest_framework import serializers
from .models import Post


# Định nghĩa model cần serialize và các trường. ở đây mình để là all.
# Có rất nhiều API class mà rest đã viết sẵn. ở đây mình chỉ dùng 2 class để thao tác CRUD với database. 
class PostListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'


# API get detail, update, delete
class PostDetailUpdateAPIView(viewsets.GenericViewSet,
                              RetrieveUpdateDestroyAPIView):
    queryset = Post.objects.all()
    serializer_class = PostListSerializer
    lookup_field = 'id'
    # permission_classes = [IsAuthenticated]


# API get list and create
class PostListCreateAPIView(viewsets.GenericViewSet,
                            ListCreateAPIView):
    serializer_class = PostListSerializer
    queryset = Post.objects.all()

Để API có thể hoạt động tất nhiên phải gán nó cho một url nào đó. Việc đó ta làm ở file url.py

# url.py
from django.conf.urls import url, include
from django.contrib import admin
from rest_framework import routers
from rest.views import PostListCreateAPIView, PostDetailUpdateAPIView

router = routers.SimpleRouter()
router.register(r'posts', PostListCreateAPIView, base_name="Posts")     # đăng ký API vào router
router.register(r'posts', PostDetailUpdateAPIView, base_name="Posts")


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url('^api/', include(router.urls))  #  Đăng ký router url vào project url
]

Giải thích qua một chút về đoạn này.

router.register(r'posts', PostListCreateAPIView, base_name="Posts")     # đăng ký API vào router
router.register(r'posts', PostDetailUpdateAPIView, base_name="Posts")

Đăng ký API như thế này mục đích chính là để nhóm các url lại. làm cho việc sửa dụng được dễ dàng hơn mặc dù nhìn code có vẻ gây hoang mang. tóm gọn lại là :

  • GET ^api/posts sẽ trả về list
  • POST ^api/posts sẽ tạo mới post
  • GET ^api/posts/:id sẽ trả về detail của post với id là :id
  • PUT ^api/posts/:id sẽ update resource
  • DELETE ^api/posts/:id sẽ xóa resource

Như vậy là đã đúng theo chuẩn REST rồi nhé 😄

Tiếp theo sẽ là cách test thử vài chức năng.

curl -i -H "Accept: application/json" http://localhost:8000/api/posts/

Test kết quả

kết quả:

alt text

Django REST hỗ trợ sẵn web interface cho việc debug cũng như test. ta có thể sử dụng luôn nó cho trực quan

Truy cập vào url http://localhost:8000/api/posts/

alt text

Có sẵn phần post ở ngay phía cuối:

alt text

Vào thử API detail của post http://localhost:8000/api/posts/2/

alt text

OK. Như vậy mình đã giới thiệu sơ qua về django restframework. Còn rất rất nhiều tính năng thú vị khác của django rest mà nếu có cơ hội mình sẽ viết 1 bài giới thiệu kỹ càng hơn.

Cuối cùng, Thanks for reading !


All Rights Reserved