[Một gói mỗi ngày] Django Ninja

By JoeVu, at: 12:32 Ngày 29 tháng 5 năm 2024

Thời gian đọc ước tính: __READING_TIME__ minutes

[One Day One Package] An Overview of Django Ninja
[One Day One Package] An Overview of Django Ninja

Django Ninja là một framework web mạnh mẽ được thiết kế để xây dựng các API với Django bằng Python 3.6+ và các gợi ý kiểu dữ liệu. Nó được biết đến với hiệu năng cao, dễ sử dụng và khả năng tương thích với Django ORM. Dưới đây là tổng quan về các tính năng và cập nhật gần đây của nó.

 

Các Tính Năng Chính

 

  1. Gợi ý Kiểu Dữ liệu: Django Ninja tận dụng các gợi ý kiểu dữ liệu của Python để xác thực yêu cầu và phản hồi, cải thiện khả năng đọc mã và giảm lỗi.
     
  2. Hiệu năng Cao: Sử dụng Pydantic và Starlette, Django Ninja cung cấp tốc độ thực thi nhanh, làm cho nó trở thành lựa chọn phù hợp cho các ứng dụng quan trọng về hiệu năng.
     
  3. Dễ Sử dụng: Framework được thiết kế để tích hợp liền mạch với các dự án Django hiện có, yêu cầu tối thiểu mã boilerplate.
     
  4. Hỗ trợ Đồng bộ và Bất đồng bộ: Hỗ trợ cả các view đồng bộ và bất đồng bộ, cung cấp tính linh hoạt cho nhiều trường hợp sử dụng.
     
  5. Tự động Tạo Tài liệu: Tự động tạo tài liệu OpenAPI, có thể dễ dàng truy cập và tương tác thông qua giao diện web.
     
  6. Tích hợp ORM: Hoạt động tốt với Django ORM, cho phép tương tác cơ sở dữ liệu mượt mà.
     
  7. Xác thực: Xác thực yêu cầu và phản hồi toàn diện bằng các mô hình Pydantic đảm bảo tính toàn vẹn dữ liệu.

 

Các Vấn Đề Khó Khăn trong Django Ninja

 

Django Ninja là một framework đầy triển vọng, nhưng nó có một số vấn đề đang diễn ra có thể gây khó khăn cho các nhà phát triển. Dưới đây là một số vấn đề đáng chú ý nhất:

 

  1. Vấn đề Tương thích với Pydantic v2: Django Ninja hiện đang gặp vấn đề về khả năng tương thích với Pydantic v2. Vấn đề này xuất phát từ những thay đổi đáng kể trong Pydantic mà Django Ninja chưa hỗ trợ, dẫn đến các sự cố tiềm ẩn khi cập nhật các phụ thuộc​ (GitHub)​​ (GitHub)​.
     

  2. Hỗ trợ GeoDjango: Có vấn đề khi sử dụng các trường tùy chỉnh của GeoDjango như PointField. Các trường này không được hỗ trợ ngay lập tức, gây ra lỗi trong quá trình tạo schema. Các giải pháp thay thế bao gồm sử dụng các thuộc tính tùy chỉnh và cập nhật ánh xạ kiểu dữ liệu thủ công, nhưng vẫn thiếu hỗ trợ gốc​ (GitHub)​.
     

  3. Tích hợp OAuth 2: Người dùng đã yêu cầu hỗ trợ tích hợp OAuth 2, tương tự như cách Django REST Framework (DRF) tích hợp với django-oauth-toolkit. Hiện tại, các nhà phát triển cần triển khai các giải pháp tùy chỉnh để đạt được chức năng OAuth 2, điều này có thể phức tạp​ (GitHub)​.
     

  4. Vấn đề Tài liệu OpenAPI: Đã có báo cáo về việc tài liệu OpenAPI không hiển thị chính xác trong khi các điểm cuối API khác hoạt động tốt. Vấn đề này thường liên quan đến cấu hình URL và yêu cầu xử lý cẩn thận các dấu gạch chéo cuối và đường dẫn tài liệu​ (GitHub)​.
     

  5. Sự không khớp giữa Schema Pydantic và OpenAPI: Một vấn đề đáng kể khác là sự không khớp giữa các phiên bản schema Pydantic và các kỳ vọng của OpenAPI. Pydantic tạo schema bằng bản nháp schema JSON mới nhất, trong khi OpenAPI yêu cầu phiên bản cũ hơn. Điều này gây ra vấn đề với các công cụ tạo mã và yêu cầu quản lý cẩn thận các phiên bản schema​ (GitHub)​.
     

  6. Xác thực ở cấp Router: Có những phức tạp khi triển khai xác thực ở cấp router. Các vấn đề phát sinh với nhiều instance NinjaAPI và cấu hình của chúng, dẫn đến xung đột và lỗi xác thực​ (GitHub)​.
     

  7. Tách gói ModelSchema: Có đề xuất tách ModelSchema thành gói riêng. Hiện tại, các nhà phát triển cần cài đặt toàn bộ gói Django Ninja ngay cả khi họ chỉ cần ModelSchema, điều này có thể không hiệu quả và dẫn đến các phụ thuộc không cần thiết​ (GitHub)​.

 

So sánh giữa Django Ninja và Django Rest Framework

 

So sánh Django Ninja với Django Rest Framework

 

Những Hạn Chế

 

Những hạn chế của Django Ninja không được nêu rõ trong các nguồn được cung cấp. Mặc dù nó vượt trội ở nhiều khía cạnh như hiệu năng, dễ phát triển và tuân thủ các tiêu chuẩn API như OpenAPI và JSON Schema, nhưng những hạn chế tiềm ẩn có thể bao gồm:

 

  1. Thiếu Hệ Sinh Thái: Người dùng đã đề cập rằng Django Ninja thiếu hệ sinh thái xung quanh nó so với DRF, điều này có thể dẫn đến nhiều mã boilerplate và nỗ lực triển khai bổ sung
     
  2. Mã Boilerplate: Một số người dùng đã bày tỏ rằng mã của Django Ninja có thể dài dòng hơn, yêu cầu nhiều boilerplate hơn so với DRF, điều này có thể dẫn đến những thách thức về kiến trúc
     
  3. Triển khai Tùy chỉnh: Người dùng đã báo cáo phải tự triển khai logic nhật ký yêu cầu token và các chức năng khác không có sẵn trong Django Ninja, cho thấy các khoảng trống tiềm năng trong các tính năng tích hợp
     
  4. Mô hình Kinh doanh và Hỗ trợ: Mối quan tâm đã được đặt ra về mô hình kinh doanh và quy mô nhóm hỗ trợ của Django Ninja, làm nổi bật tầm quan trọng của sự hỗ trợ cộng đồng và nỗ lực bảo trì cho các dự án nguồn mở
     
  5. So sánh với DRF: Mặc dù Django Ninja cung cấp tốc độ và dễ triển khai, nhưng nó có thể không mạnh mẽ bằng DRF trong việc xử lý một số trường hợp nhất định hoặc cung cấp một tập hợp đầy đủ các tính năng

 

Một Ví Dụ

 

Bước 1: Thiết lập Môi trường của Bạn

 

Cài đặt Django và Django Ninja: Đầu tiên, hãy đảm bảo bạn đã cài đặt Python. Sau đó, tạo một môi trường ảo và cài đặt Django và Django Ninja.

 

python -m venv venv
source venv/bin/activate
pip install django django-ninja

 

Tạo một Dự án Django Mới: Sử dụng lệnh startproject của Django để tạo một dự án mới.

 

django-admin startproject simpleproject
cd simpleproject

 

Tạo một Ứng dụng Django Mới: Sử dụng lệnh startapp của Django để tạo một ứng dụng mới trong dự án của bạn.

 

python manage.py startapp simpleapp

 

Bước 2: Thiết lập Django Ninja

 

Tạo một Tệp API: Trong thư mục ứng dụng của bạn (simpleapp), tạo một tệp mới có tên api.py

 

# simpleapp/api.py
from ninja import NinjaAPI

api = NinjaAPI()


@api.get("/hello")
def hello(request):
    return {"message": "Hello, world!"}


Thêm API vào Cấu hình URL của Django: Chỉnh sửa tệp urls.py của dự án để thêm các URL của API.

 

# simpleproject/urls.py
from django.contrib import admin
from django.urls import path
from simpleapp.api import api

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', api.urls),  # Thêm dòng này
]

 

Bước 3: Chạy Ứng dụng

 

Áp dụng Migrations: Áp dụng bất kỳ migrations ban đầu nào được yêu cầu bởi Django.

 

python manage.py migrate


Chạy Server Phát Triển: Khởi động server phát triển Django.

 

python manage.py runserver


Truy cập API: Mở trình duyệt web của bạn và điều hướng đến http://127.0.0.1:8000/api/hello. Bạn sẽ thấy phản hồi JSON:

 

{ "message": "Hello, world!" }

 

Bước 4: Mở rộng Ứng dụng

 

Tạo Schema Pydantic: Định nghĩa schema Pydantic để xác thực yêu cầu.

 

# simpleapp/api.py
from pydantic import BaseModel


class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None


Thêm Điểm cuối POST: Sử dụng schema trong điểm cuối POST.

 

# simpleapp/api.py
@api.post("/items")
def create_item(request, item: Item):
    return {"item": item.dict()}


Kiểm tra Điểm cuối POST: Sử dụng một công cụ như Postman hoặc curl để kiểm tra điểm cuối mới:

 

curl -X POST "http://127.0.0.1:8000/api/items" -H "accept: application/json" -H "Content-Type: application/json" -d '{"name":"Sample Item","description":"A sample item","price":10.99,"tax":0.99}'

 

Bạn sẽ nhận được phản hồi chứa dữ liệu mục mà bạn đã gửi.

 

{ "item": { "name": "Sample Item", "description": "A sample item", "price": 10.99, "tax": 0.99 } }


Đó là tất cả! Bạn đã tạo một ứng dụng Django Ninja đơn giản với điểm cuối GET và POST. Bây giờ bạn có thể mở rộng ứng dụng của mình bằng cách thêm nhiều điểm cuối hơn, tích hợp với cơ sở dữ liệu và sử dụng các tính năng khác do Django Ninja cung cấp.

 

Kết luận

 

Django Ninja nổi bật như một framework hiện đại và hiệu quả để xây dựng các API với Django. Việc sử dụng các gợi ý kiểu dữ liệu và tài liệu tự động, kết hợp với hiệu năng cao và dễ sử dụng, làm cho nó trở thành một lựa chọn hấp dẫn cho các nhà phát triển. Tuy nhiên, việc theo dõi các vấn đề về khả năng tương thích và tận dụng các giải pháp thay thế của cộng đồng có thể giúp tận dụng tối đa framework này.

 

Tag list:
- Django Packages
- Key Features
- Django Ninja
- New Features
- Django Ninja Overview

Liên quan

Django rest framework Django

Đọc thêm
Django Python

Đọc thêm
Django rest framework Python

Đọc thêm

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.