Contents

Xây dựng API CRUD REST với Chế độ xem dựa trên lớp trong Khung REST Django

Django Rest Framework (DRF) là một khung Django cung cấp hỗ trợ xây dựng API REST. Giống như Django, DRF cho phép bạn xây dựng các chế độ xem API của mình bằng các chế độ xem dựa trên chức năng hoặc dựa trên lớp.

Mặc dù ban đầu, các chế độ xem dựa trên lớp có thể có đường cong học tập dốc, nhưng chúng được đặc trưng bởi một số ưu điểm như tổ chức mã được cải thiện, tăng tính mô-đun thông qua tính kế thừa, khả năng sử dụng lại nâng cao và tính ngắn gọn trong cách diễn đạt.

Tạo API Trình quản lý công thức với Django REST Framework

Ứng dụng quản lý công thức đóng vai trò là nền tảng tuyệt vời để khám phá các chế độ xem dựa trên lớp trong Django Rest Framework (DRF). Bằng cách kết hợp các tính năng như tạo, sửa đổi và loại bỏ các công thức nấu ăn, người ta có thể hiểu được cách triển khai các chức năng CRUD (Tạo, Đọc, Cập nhật, Xóa). Hướng dẫn này sẽ hướng dẫn bạn cách tạo giao diện CRUD thông qua một loạt các bước tuần tự.

Mã nguồn của hướng dẫn này có sẵn để truy cập và tải xuống từ nền tảng GitHub, nền tảng này đóng vai trò là trung tâm để các nhà phát triển cộng tác và chia sẻ công việc của họ với những người khác dưới dạng kho lưu trữ nguồn mở.

Bước 1: Cài đặt Django REST Framework và cấu hình dự án của bạn

⭐ Tạo môi trường ảo cho dự án của bạn và cài đặt các phần phụ thuộc sau:

 pip install django djangorestframework

⭐ Tạo dự án Django có tên core bằng lệnh sau:

 django-admin startproject core .

⭐ Tạo một ứng dụng có tên là Recipe_manager:

 python manage.py startapp recipe_manager

⭐ Mở tệp core/settings.py và điều hướng đến danh sách INSTALLED_APPS để đăng ký ứng dụng của bạn:

 INSTALLED_APPS = [
    # custom apps
    'rest_framework',
    'recipe_manager',
]

Bước 2: Tạo mô hình cho ứng dụng Công thức nấu ăn của bạn

⭐ Mở tệp Recipe_manager/models.py và tạo mô hình cho ứng dụng của bạn. Đây là một ví dụ cơ bản về mô hình công thức nấu ăn:

 # models.py
from django.db import models

class Recipe(models.Model):
    recipe_name = models.CharField(max_length=255)
    ingredients = models.TextField()
    instructions = models.TextField()

⭐ Tạo quá trình di chuyển và di chuyển mô hình của bạn vào cơ sở dữ liệu bằng lệnh này:

 python manage.py makemigrations && python manage.py migrate

Bước 3: Tạo Serializer cho ứng dụng của bạn

Trình tuần tự hóa đóng vai trò là một phần không thể thiếu của khung Django, tạo điều kiện thuận lợi cho việc chuyển đổi các cấu trúc dữ liệu phức tạp, bao gồm các bộ truy vấn, thành các định dạng phù hợp để hiển thị, bao gồm các ví dụ như JSON hoặc XML.

Để tạo một serializer, hãy làm theo các bước sau:

⭐Tạo một tệp có tênrecipe_manager/serializers.py.

⭐ Nhập mô-đun serializers cũng như model bạn muốn serializer:

 # serializers.py
from rest_framework import serializers

from .models import Recipe # the model to serialize

⭐ Trong cùng một tệp, hãy tạo một lớp serializer cho mô hình của bạn và xác định lớp Meta trong đó:

 # serializers.py
class RecipeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Recipe
        fields = ('recipe_name', 'ingredients', 'instructions')

Trong mã này, lớp Meta xác định mô hình để tuần tự hóa và các trường cụ thể mà trình tuần tự hóa sẽ xử lý. Thuộc tính trường có thể là danh sách hoặc bộ dữ liệu. Nếu bạn muốn tuần tự hóa tất cả các trường trong mô hình của mình, bạn có thể làm như sau:

 class Meta:
 fields = "__all__"

Bước 4: Viết View cho thao tác CREATE

Bạn có thể tạo chế độ xem dựa trên lớp cho ứng dụng của mình bằng cách nhập chế độ xem chung có sẵn trong Django. Bạn có thể đọc về những quan điểm này từ tài liệu chính thức của Django. Để triển khai hoạt động CREATE của CRUD, bạn nên nhập CreateAPIView. Bạn cũng nên nhập bộ nối tiếp và mô hình của mình:

 # views.py
from rest_framework.generics import CreateAPIView

from .models import Recipe
from .serializers import RecipeSerializer

Để thực hiện quy trình tạo thực thể mới trong một chế độ xem cụ thể bằng API REST, tất cả những gì cần thiết là chỉ định phương thức tuần tự hóa cụ thể mà chế độ xem sẽ sử dụng. Một ví dụ minh họa về điều này có thể được quan sát như sau:

 # Create view
class RecipeCreateView(CreateAPIView):
    serializer_class = RecipeSerializer

Việc sử dụng cấu hình này cho phép thực thi các yêu cầu POST tới ứng dụng của bạn.

Bước 5: Viết View cho thao tác READ

⭐ Để triển khai thao tác ĐỌC, hãy nhập ListAPIView vào chế độ xem của bạn. Chế độ xem này giúp bạn liệt kê các đối tượng mô hình:

 # views.py
from rest_framework.generics import CreateAPIView, ListAPIView

⭐ Tạo một lớp cho chế độ xem của bạn và chỉ định bộ tuần tự hóa và bộ truy vấn sẽ sử dụng:

 # List view
class RecipeListView(ListAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

⭐ Tạo chế độ xem để đọc một công thức cụ thể. Để thực hiện việc này, bạn cần có RetrieveAPIView, vì vậy hãy thêm nó vào danh sách nhập của bạn:

 # views.py
from rest_framework.generics import CreateAPIView, ListAPIView, RetrieveAPIView

Tiếp theo, tạo chế độ xem bạn cần:

 # Retrieve view
class RecipeRetrieveView(RetrieveAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

Bước 6: Viết View cho thao tác UPDATE và DELETE

Để thực hiện các thao tác CẬP NHẬT và XÓA, cần phải sử dụng các chế độ xem API tương ứng, cụ thể là UpdateAPIView DestroyAPIView. Do đó, những chế độ xem này phải được nhập tương ứng.

 from rest_framework.generics import (
    ListAPIView,
    CreateAPIView,
    RetrieveAPIView,
    UpdateAPIView, # new
    DestroyAPIView, # new
)

Tiếp theo, chúng tôi sẽ triển khai các chế độ xem cần thiết sẽ kế thừa từ cả UpdateAPIViewDestroyAPIView , theo đó:

 # Update view
class RecipeUpdateView(UpdateAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

# Delete view
class RecipeDeleteView(DestroyAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

Bước 7: Tạo URL cho ứng dụng của bạn

⭐ Thêm mã này vào core/urls.py để định cấu hình URL của bạn:

 from django.urls import path, include

urlpatterns = [
    path('api/', include('recipe_manager.urls'))
]

⭐ Thêm mã sau vào tệp Recipe_manager/urls.py của bạn:

 from django.urls import path
from . import views

urlpatterns = [
    # List view (Read all)
    path('recipes/', views.RecipeListView.as_view(), name='recipe-list'),

    # Create view
    path('recipes/create/', views.RecipeCreateView.as_view(), name='recipe-create'),

    # Retrieve view (Read one)
    path('recipes/<int:pk>/', views.RecipeRetrieveView.as_view(), name='recipe-retrieve'),

    # Update view
    path('recipes/<int:pk>/update/', views.RecipeUpdateView.as_view(), name='recipe-update'),

    # Delete view
    path('recipes/<int:pk>/delete/', views.RecipeDeleteView.as_view(), name='recipe-destroy'),
]

Từ đoạn mã trên, bạn sẽ thấy rằng các chế độ xem dựa trên lớp sử dụng hàm as_view() để tạo các mẫu URL của chúng. Bạn cũng có thể đọc về sự khác biệt giữa dự án và ứng dụng ở Django nếu bạn bối rối về cách sử dụng chúng tại đây.

Bước 8: Kiểm tra điểm cuối API của bạn

Từ thư mục dự án của bạn, hãy chạy như sau:

 python manage.py runserver 

Hành động này dự kiến ​​sẽ khởi động máy chủ, thực hiện một số kiểm tra nhất định và tạo ra một địa chỉ web cho phép truy cập từ xa.

Giờ đây, bạn có thể xác thực các điểm cuối API của mình bằng cách truy cập các URI tương ứng của chúng, chẳng hạn như “/api/recipes/” và sử dụng các phương thức yêu cầu HTTP khác nhau để thực hiện các thao tác CRUD. Dự đoán rằng bạn sẽ gặp một giao diện người dùng tiêu chuẩn tương tự như giao diện được mô tả bên dưới:

/vi/images/django-s-default-api-testing-interface.jpg

Ngoài ra, thay vì sử dụng trình duyệt web, người ta có thể chọn sử dụng ứng dụng Postman để thử nghiệm và tương tác với API.

Thực hành DRY khi tạo API CRUD

Việc áp dụng nguyên tắc lập trình được gọi là “DRY” rất được khuyến khích để nâng cao chất lượng tổng thể của mã của bạn. Nguyên tắc này, viết tắt của “Đừng lặp lại chính mình”, khuyến khích các nhà phát triển tránh trùng lặp mã và thay vào đó cố gắng đạt được hiệu quả bằng cách sử dụng lại các thành phần hiện có hoặc tạo thành phần mới khi cần thiết. Bằng cách đó, người ta không chỉ tiết kiệm thời gian mà còn đảm bảo rằng mã của họ vẫn nhất quán và có thể duy trì theo thời gian.

Xem xét các quan điểm đã thảo luận trước đó, cần lưu ý rằng việc sử dụng các chế độ xem chung ListCreateAPIView và RetrieveUpdateDestroyAPIView có thể giảm đáng kể sự dư thừa trong mã của bạn.

ListCreateAPIView là sự kết hợp của cả ListAPIView và CreateAPIView, trong khi RetrieveUpdateDestroyAPIView kết hợp chức năng Truy xuất của RetrieveAPIView với các khả năng Cập nhật và Xóa tương ứng có trong UpdateAPIView và DestroyAPIView.

Người ta có thể thay đổi quan điểm trước đó của mình bằng cách áp dụng bố cục giống như ví dụ sau:

 from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView

from .models import Recipe
from .serializers import RecipeSerializer

class RecipeListCreateAPIView(ListCreateAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

class RecipeRetrieveUpdateDeleteAPIView(RetrieveUpdateDestroyAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

Việc sử dụng phương pháp này mang lại cấu trúc mã hóa ngắn gọn và hợp lý hơn, do đó giảm thiểu việc tích lũy quá nhiều dòng mã.

Để tạo liên kết đến các chế độ xem mới được tạo, bạn có thể làm theo các bước sau:

 from django.urls import path
from .views import RecipeListCreateAPIView, RecipeRetrieveUpdateDeleteAPIView

urlpatterns = [
    # List and Create view
    path('recipes/', RecipeListCreateAPIView.as_view(), name='recipe-list-create'),

    # Retrieve, Update, and Delete view
    path('recipes/<int:pk>/', RecipeRetrieveUpdateDeleteAPIView.as_view(), name='recipe-retrieve-update-destroy'),
]

Bạn có thể đánh giá các điểm cuối này bằng cách sử dụng

Chế độ xem chung dựa trên lớp giúp công việc của bạn dễ dàng hơn

Ở trên đã chứng minh rằng việc sử dụng các khung nhìn dựa trên lớp chung có thể đẩy nhanh quá trình xây dựng các khung nhìn. Hiện tại, tất cả những gì cần thiết là kế thừa APIView thích hợp theo ứng dụng cụ thể của một người.

Bạn nên làm theo các kỹ thuật lập trình hợp lý để ngăn chặn việc tạo mã dưới mức tối ưu.