Nỗi ám ảnh mang tên “Validation thủ công”
Bạn đã bao giờ phát điên khi phải viết hàng chục dòng if-else chỉ để kiểm tra một cái email hay số điện thoại chưa? Lúc mới làm Backend với Python, mình từng sa lầy vào việc check dữ liệu đầu vào. Code phình to nhanh chóng. Việc bảo trì trở thành cơn ác mộng khi yêu cầu nghiệp vụ thay đổi.
Tệ hơn nữa là vấn đề hiệu năng. Các framework truyền thống như Flask thường chạy đồng bộ (synchronous). Khi xử lý hàng nghìn request cùng lúc, hệ thống dễ rơi vào tình trạng nghẽn cổ chai. Đó là lúc FastAPI xuất hiện như một vị cứu tinh. Kết hợp với Pydantic, bộ đôi này giúp mình viết code sạch hơn, đồng thời tận dụng tối đa async/await để đạt tốc độ xử lý tương đương với Go hoặc Node.js.
Quick Start: 5 phút để có ngay một API chuẩn chỉnh
Đầu tiên, hãy cài đặt FastAPI và Uvicorn. Uvicorn đóng vai trò là ASGI server giúp ứng dụng chạy mượt mà.
pip install fastapi uvicorn
Thử ngay một file main.py đơn giản:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Welcome to itfromzero.com!"}
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
Khởi động server bằng lệnh:
uvicorn main:app --reload
Điểm ăn tiền nhất? Hãy truy cập /docs. FastAPI tự động tạo Swagger UI cực kỳ chuyên nghiệp. Bạn có thể test API ngay lập tức mà không cần cài thêm Postman hay viết tài liệu thủ công.
Pydantic v2: Khi Rust làm nền tảng cho Validation
Pydantic chính là bộ não xử lý dữ liệu của FastAPI. Ở phiên bản v2, Pydantic được viết lại bằng Rust, giúp tốc độ validation nhanh hơn gấp 5-10 lần so với bản cũ. Nó sử dụng Python Type Hints để ép kiểu dữ liệu ngay từ “cửa ngõ”.
Định nghĩa Schema thông minh
Thay vì thao tác với dictionary thô, hãy định nghĩa một class kế thừa từ BaseModel:
from pydantic import BaseModel, EmailStr, Field
from typing import Optional
class UserCreate(BaseModel):
username: str = Field(..., min_length=3, max_length=20)
email: EmailStr
password: str = Field(..., min_length=8)
age: Optional[int] = Field(None, ge=18) # Phải từ 18 tuổi trở lên
Nếu người dùng gửi thiếu email hoặc nhập tuổi là 17, FastAPI sẽ chặn đứng request. Hệ thống tự động trả về lỗi 422 Unprocessable Entity với mô tả chi tiết. Bạn tiết kiệm được hàng giờ viết logic kiểm tra lỗi.
Validation nâng cao với Custom Validator
Đôi khi các quy tắc cơ bản là chưa đủ. Giả sử mã nhân viên của bạn phải bắt đầu bằng chữ “IT” kèm 4 chữ số. Đây là lúc Regex phát huy tác dụng.
Mẹo nhỏ: Khi cần test nhanh các pattern phức tạp, mình thường dùng Regex Tester để kiểm tra trước khi đưa vào code. Tiết kiệm khối thời gian debug!
from pydantic import field_validator
import re
class Employee(BaseModel):
emp_code: str
@field_validator('emp_code')
@classmethod
def validate_emp_code(cls, v: str):
if not re.match(r'^IT\d{4}$', v):
raise ValueError('Mã nhân viên phải đúng định dạng ITxxxx')
return v
Đừng lãng phí Async/Await
Nhiều dev mới thường dùng def thay vì async def một cách tùy tiện. Với FastAPI, nếu bạn cần gọi Database hoặc API bên thứ ba, hãy luôn dùng async.
Trong các bài benchmark thực tế, FastAPI có khả năng xử lý khoảng 9,000 request/giây, vượt xa con số ~1,000 của Flask trên cùng một tài nguyên. async giúp server không phải đứng chờ I/O. Nó tận dụng thời gian rảnh để xử lý các request khác, tối ưu hóa băng thông tối đa.
@app.get("/data")
async def get_external_data():
# Giả sử đây là một lệnh gọi DB tốn 200ms
data = await database.fetch_all("SELECT * FROM users")
return data
Kinh nghiệm thực chiến để dự án không thành “đống rác”
Sau nhiều dự án quy mô lớn, đây là những lưu ý sống còn:
- Nâng cấp Pydantic v2: Đừng dùng v1 nếu bạn muốn tận dụng sức mạnh của Rust engine.
- Dependency Injection (DI): Hãy dùng hệ thống DI tích hợp sẵn để quản lý kết nối Database hoặc Authentication. Nó giúp code cực kỳ dễ test.
- Chia nhỏ module: Đừng nhồi nhét mọi thứ vào
main.py. Hãy tách riêngrouters/,schemas/, vàservices/ngay từ ngày đầu. - Sử dụng Annotated: Cú pháp
Annotated[str, Field(...)]giúp code rõ ràng và hỗ trợ gợi ý (Intellisense) tốt hơn hẳn trên VS Code.
FastAPI không chỉ là câu chuyện về tốc độ thực thi. Nó là về tốc độ phát triển. Việc tự động hóa validation và documentation giúp bạn tập trung hoàn toàn vào logic nghiệp vụ thay vì những thứ lặp đi lặp lại nhàm chán.
