Ngày 3: Tìm Hiểu Pydantic và Kiểm Tra Dữ Liệu Trong Ứng Dụng Web
1. Giới thiệu về Pydantic
1.1. Pydantic Là Gì?
Pydantic là một thư viện mạnh mẽ trong Python, giúp phát triển viên quản lý và kiểm tra dữ liệu một cách dễ dàng và hiệu quả. Hãy tưởng tượng bạn có một người bạn thông minh, luôn bên cạnh giúp bạn kiểm tra các dữ liệu để đảm bảo mọi thứ đều chính xác và hợp lệ.
- Nguyên lý hoạt động: Bạn có thể nói với Pydantic rằng "mình muốn dữ liệu phải đúng như thế này!"
- Ví dụ cụ thể: Nếu bạn muốn tên của một sản phẩm phải là chữ và giá của nó phải là số, Pydantic sẽ giúp bạn làm điều đó. Nếu ai đó đưa cho bạn một dữ liệu không phù hợp, Pydantic sẽ thông báo lỗi ngay lập tức.
- Lợi ích: Việc sử dụng Pydantic giúp cho mã nguồn của bạn trở nên dễ đọc và rõ ràng hơn, giống như một cuốn truyện tranh có hình ảnh minh họa.
Tóm gọn lại:
- Kiểu dữ liệu: Sử dụng "type hints" (gợi ý kiểu) của Python để xác định loại dữ liệu mong muốn.
- Kiểm tra dữ liệu: Ngay khi dữ liệu không phù hợp được gửi tới, Pydantic sẽ thông báo lỗi ngay lập tức.
- Rõ ràng và dễ đọc: Code của bạn sẽ trở nên mạch lạc và dễ hiểu hơn.
1.2. Tại Sao Nên Sử Dụng Pydantic?
Pydantic mang lại nhiều lợi ích rõ ràng:
- Tính chính xác: Đảm bảo dữ liệu luôn ở định dạng cần thiết.
- Ngăn ngừa lỗi: Giảm thiểu khả năng xảy ra lỗi do dữ liệu không hợp lệ.
- Tài liệu API chính xác: Tạo ra tài liệu API rõ ràng và dễ hiểu hơn cho người dùng.
- Cải thiện trải nghiệm người dùng: Người dùng sẽ có trải nghiệm tốt hơn khi hệ thống hoạt động chính xác và mượt mà.
2. Thực Chiến Với Pydantic
2.1. Cách Định Nghĩa Pydantic Model
Để bắt đầu, bạn cần cài đặt thư viện Pydantic:
pip install pydantic
Sau khi cài xong, bạn có thể tạo ra một Pydantic Model như sau:
- Tạo một class bằng cách kế thừa từ
pydantic.BaseModel
. - Thêm các thuộc tính cho class, chẳng hạn như
name
,description
,price
,tax
. - Định nghĩa kiểu cho từng thuộc tính, ví dụ
name
là chuỗi (string),price
là số (float). - Nếu một thuộc tính nào đó là không bắt buộc, bạn có thể sử dụng
typing.Optional
để chỉ định điều đó. - Bạn cũng có thể đặt giá trị mặc định cho các thuộc tính.
Dưới đây là một ví dụ về cách định nghĩa một Pydantic Model:
from typing import Optional
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None # Có thể không có
price: float
tax: Optional[float] = None # Có thể không có
Lưu ý: Bạn có thể xây dựng các Pydantic Model phức tạp hơn bằng cách lồng các model vào nhau, giống như cách bạn xây dựng một lâu đài từ các viên gạch LEGO.
2.2. Bài Tập Thực Hành
Bài Tập 1: Tạo Model Cho Người Dùng
Hãy tạo một Pydantic Model cho người dùng (User) với các thuộc tính:
username
: chuỗi (string)email
: chuỗi (string)full_name
: chuỗi (string) có thể là Noneage
: số nguyên (integer) có thể là None
from pydantic import BaseModel
from typing import Optional
class User(BaseModel):
username: str
email: str
full_name: Optional[str] = None
age: Optional[int] = None
Bài Tập 2: Kiểm Tra Dữ Liệu
Viết một hàm để kiểm tra tính hợp lệ của một đối tượng User
sử dụng model đã tạo:
def create_user(user_data):
try:
user = User(**user_data)
print("User created successfully:", user)
except Exception as e:
print("Error:", e)
# Thử nghiệm với dữ liệu hợp lệ
create_user({
"username": "john_doe",
"email": "john@example.com",
"full_name": "John Doe",
"age": 30
})
# Thử nghiệm với dữ liệu không hợp lệ
create_user({
"username": "jane_doe",
"email": "jane@example.com",
"full_name": "Jane Doe",
"age": "thirty" # Lỗi: age phải là số nguyên
})
2.3. Bài Tập Nâng Cao
Bài Tập 3: Lồng Nhiều Models Vào Nhau
Tạo một model cho địa chỉ (Address) và lồng vào model User
với các thuộc tính:
street
: chuỗi (string)city
: chuỗi (string)state
: chuỗi (string)zip_code
: chuỗi (string)
class Address(BaseModel):
street: str
city: str
state: str
zip_code: str
class UserWithAddress(BaseModel):
username: str
email: str
full_name: Optional[str] = None
age: Optional[int] = None
address: Address
# Thử nghiệm với UserWithAddress Model
create_user_with_address({
"username": "john_doe",
"email": "john@example.com",
"full_name": "John Doe",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip_code": "12345"
}
})
2.4. Kết Luận
Pydantic là một công cụ hữu ích giúp các lập trình viên định nghĩa cấu trúc dữ liệu một cách rõ ràng và kiểm tra tính hợp lệ của dữ liệu trước khi sử dụng. Hãy tiếp tục khám phá về Swagger UI, Query Parameters, và Path Parameters trong ngày tiếp theo. Trong bài tiếp theo, chúng ta sẽ tìm hiểu thêm về cách thức làm việc với FastAPI một cách hiệu quả hơn.
source: viblo