Django Ninja: Xây dựng REST API tốc độ cao không còn là nỗi lo

Python tutorial - IT technology blog
Python tutorial - IT technology blog

Tại sao DRF đôi khi khiến chúng ta cảm thấy hụt hơi?

Nếu đã gắn bó với hệ sinh thái Django, chắc hẳn bạn không lạ gì Django Rest Framework (DRF). Đây là một thư viện tiêu chuẩn, mạnh mẽ và cực kỳ đầy đủ. Tuy nhiên, DRF thường đi kèm với một cái giá: sự cồng kềnh. Việc định nghĩa Serializers phức tạp hay lồng ghép các lớp chỉ để trả về vài trường dữ liệu đôi khi khiến dự án trở nên nặng nề hơn mức cần thiết.

Trong một dự án thực tế yêu cầu xử lý hơn 1.500 request mỗi giây, mình từng gặp bế tắc khi logic validation quá nặng. Đó là lúc mình tìm đến Django Ninja. Trải nghiệm này giống như việc bạn mang sự linh hoạt của FastAPI đặt vào bộ khung vững chắc của Django vậy.

Điểm khác biệt cốt lõi nằm ở việc Django Ninja tận dụng Type HintsPydantic. Cách tiếp cận này giúp giảm thiểu đáng kể boilerplate code. Theo nhiều benchmark, Pydantic v2 có tốc độ parse dữ liệu nhanh hơn gấp 5-10 lần so với Serializer truyền thống của DRF.

Django Ninja là gì và tại sao bạn nên quan tâm?

Hiểu đơn giản, Django Ninja là một thư viện giúp xây dựng API dựa trên các tính năng hiện đại của Python 3. Nó không cố gắng thay thế hoàn toàn Django mà chỉ tập trung vào việc tối ưu hóa lớp giao tiếp API.

Dưới đây là những lý do khiến mình ưu tiên sử dụng nó cho các microservices mới:

  • Hiệu suất vượt trội: Nhờ Pydantic, việc kiểm tra và chuyển đổi dữ liệu diễn ra gần như tức thì.
  • Tài liệu tự động: Chỉ cần viết code, bạn sẽ có ngay Swagger UI và ReDoc tại đường dẫn /docs.
  • Type Safety: VS Code hay PyCharm sẽ gợi ý code cực chuẩn, giúp bạn bắt lỗi ngay khi đang gõ phím.
  • Hỗ trợ Async: Bạn có thể sử dụng async def để xử lý các tác vụ chờ đợi I/O mà không làm nghẽn hệ thống.

Bắt tay vào xây dựng API quản lý bài viết

Để thấy rõ sự tinh gọn, chúng ta sẽ cùng xây dựng một ứng dụng Blog nhỏ. Mình mặc định bạn đã khởi tạo một dự án Django cơ bản.

Bước 1: Cài đặt thư viện

Việc cài đặt chỉ mất vài giây với lệnh pip:

pip install django-ninja

Bước 2: Model dữ liệu

Trong file models.py, chúng ta định nghĩa cấu trúc bảng đơn giản:

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    is_published = models.BooleanField(default=False)

Bước 3: Định nghĩa Schema với Pydantic

Thay vì các bộ Serializer dài dòng, chúng ta sử dụng Schema để mô tả dữ liệu đầu vào và đầu ra. Tạo file schemas.py:

from ninja import Schema
from datetime import datetime

class PostIn(Schema):
    title: str
    content: str
    is_published: bool = False

class PostOut(Schema):
    id: int
    title: str
    content: str
    created_at: datetime

Việc tách biệt InOut giúp kiểm soát dữ liệu chặt chẽ hơn. Bạn sẽ không bao giờ lo lắng về việc vô tình để lộ các trường nhạy cảm như mật khẩu hay mã định danh nội bộ.

Bước 4: Triển khai Endpoints

Tại file api.py, bạn sẽ thấy sự tương đồng thú vị với FastAPI:

from ninja import NinjaAPI
from typing import List
from .models import Post
from .schemas import PostIn, PostOut

api = NinjaAPI()

@api.get("/posts", response=List[PostOut])
def list_posts(request):
    return Post.objects.all()

@api.post("/posts", response=PostOut)
def create_post(request, data: PostIn):
    post = Post.objects.create(**data.dict())
    return post

Code trông rất thoáng và dễ bảo trì. Mọi thứ đều được định kiểu rõ ràng.

Bước 5: Cấu hình Routing

Cuối cùng, hãy đăng ký API vào urls.py của project:

from django.urls import path
from .api import api

urlpatterns = [
    path("api/", api.urls),
]

Bài học từ thực tế: Validation và Tối ưu hóa

Một điểm mình cực kỳ thích ở Django Ninja là cách nó xử lý lỗi. Nếu người dùng gửi sai định dạng, hệ thống tự động trả về mã lỗi 422 kèm mô tả chi tiết vị trí lỗi. Bạn không cần viết thêm bất kỳ dòng code xử lý ngoại lệ thủ công nào cho các trường hợp này.

Kinh nghiệm xương máu: Khi làm việc với database lớn, hãy kết hợp .values() hoặc .only() của Django ORM. Django Ninja xử lý các dictionary này cực nhanh, giúp giảm tải cho bộ nhớ server đáng kể.

Kiểm tra thành quả với Swagger

Chạy server và truy cập http://127.0.0.1:8000/api/docs. Bạn sẽ thấy một giao diện tương tác chuyên nghiệp. Tại đây, bạn có thể thử nghiệm (Try it out) các endpoint mà không cần mở Postman.

Lời kết

Django Ninja không sinh ra để tiêu diệt DRF. Tuy nhiên, nó là lựa chọn sáng giá cho các dự án ưu tiên tốc độ và sự gọn nhẹ. Nếu bạn đang mệt mỏi với đống code Serializer rườm rà, hãy thử chuyển sang Django Ninja. Chắc chắn hiệu suất làm việc của bạn sẽ tăng lên đáng kể.

Share: