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:
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
$ python3 -m venv ~/venv
$ source ~/venv/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 bản dev 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 api -> tạo một app tên là api
$ 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 -> run server lên
Nếu được như ảnh bên dưới thì ta đã sẵn sàng để đến với bước tiếp theo.
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',
'api'
)
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.
# api/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
# api/admin.py
from django.contrib import admin
from api.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:
#api/views.py
from rest_framework import viewsets
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__'
class PostAPIView(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostListSerializer
lookup_field = 'id'
Để 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
# urls.py
from django.conf.urls import url, include
from django.contrib import admin
from rest_framework import routers
from rest.views import PostAPIView
router = routers.SimpleRouter()
router.register(r'posts', PostAPIView, basename="Posts") # đăng ký API vào router
urlpatterns = [
path(r'admin/', admin.site.urls),
path('api/', include(router.urls)) # Đăng ký router url vào project url
]
Đăng ký 1 API thôi như đủ CRUD cho 1 resource luôn, cụ thể là :
- GET
^api/posts
sẽ trả về list các bài post - 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ả:
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 bằng web browser http://localhost:8000/api/posts/
Có sẵn phần post ở ngay phía cuối:
Vào thử API detail của post
http://localhost:8000/api/posts/2/
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