
FastAPI là framework web Python hiện đại dùng để xây dựng API với hiệu năng cao và tự động sinh tài liệu. Bài viết này phân tích kiến trúc, cấu trúc dự án và cách triển khai FastAPI trong môi trường thực tế.
FastAPI là gì?
FastAPI là framework web Python do tiáno show Tiangolo phát triển, tuân thủ chuẩn ASGI (Asynchronous Server Gateway Interface). Điểm khác biệt cốt lõi so với Flask hay Django là FastAPI không chỉ nhận request và trả về response, mà còn dùng type hint của Python kết hợp thư viện Pydantic để kiểm tra dữ liệu đầu vào và tạo tài liệu API tự động.
Ba yếu tố giúp FastAPI trở nên phổ biến:
- Hiệu năng: nền tảng Uvicorn dựa trên
uvloopvàhttptoolscó tốc độ xử lý request nhanh hơn đáng kể so với WSGI thông thường. - An toàn dữ liệu: kiểu dữ liệu được khai báo bằng type hint, Pydantic tự động chuyển đổi và báo lỗi chi tiết nếu request không hợp lệ.
- Tài liệu sẵn có: chỉ cần khai báo là framework sinh ra giao diện Swagger UI và ReDoc ở đường dẫn
/docsvà/redocmà không cần viết tay.

Cấu trúc dự án FastAPI chuẩn
Một dự án thực tế nên tách các phần sau để dễ bảo trì:
app/main.py: khởi tạo đối tượng FastAPI, gắn router và middleware.app/routers/: nhóm route theo từng nghiệp vụ, ví dụusers.py,orders.py.app/models/: mô hình Pydantic mô tả dữ liệu vào và dữ liệu trả về.app/dependencies/: các hàm phụ thuộc dùng chung như lấy phiên database, kiểm tra token.app/tests/: kiểm thử với pytest và httpx.
Ví dụ API tạo người dùng
Đoạn mã dưới đây minh họa toàn bộ cơ chế validation và tài liệu tự động trong một hàm duy nhất. Khi có ai đó gửi age là chuỗi ký tự, FastAPI trả về lỗi 422 kèm thông báo ngay tại giao diện Swagger.
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, EmailStr
app = FastAPI(title="Demo API", version="1.0.0")
class UserCreate(BaseModel):
name: str
email: EmailStr
age: int | None = None
class UserOut(BaseModel):
id: int
name: str
email: EmailStr
@app.post("/users", response_model=UserOut, status_code=201)
def create_user(payload: UserCreate):
if payload.age is not None and payload.age < 0:
raise HTTPException(status_code=400, detail="Tuổi không hợp lệ")
return UserOut(id=1, name=payload.name, email=payload.email)
Khai báo response_model còn mang lại một lợi ích ít ai để ý: FastAPI lọc bỏ các trường không khai báo trước khi gửi về client, tránh rò rỉ hashed_password hay internal_note ra ngoài.


Dependency Injection: kỹ thuật nền tảng
Dependency injection (DI) là ý tưởng trung tâm của FastAPI. Thay vì gọi trực tiếp hàm, bạn khai báo hàm phụ thuộc rồi dùng tham số Depends để framework tự giải quyết vòng lặp phụ thuộc và cache kết quả trong cùng một request.
from fastapi import Depends
from sqlalchemy.orm import Session
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
def get_current_user(db: Session = Depends(get_db)):
# đọc token, trả về user hoặc raise 401
return user
@app.get("/me")
def read_me(current=Depends(get_current_user)):
return current
Chỉ cần đổi get_db sang một hàm khác trong thí nghiệm, toàn bộ API sẽ chuyển sang nguồn dữ liệu mới mà không sửa một dòng nào trong các route.
Làm việc với cơ sở dữ liệu
FastAPI không áp đặt ORM nào. SQLModel kết hợp SQLAlchemy 2.0 và Pydantic nên khai báo một lần là dùng được cho cả đọc ghi và validation:
from sqlmodel import Field, Session, SQLModel, create_engine
class Hero(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str
secret_name: str
age: int | None = None
engine = create_engine("postgresql+psycopg://user:pass@localhost:5432/app")
Với hệ thống tải cao, hãy chọn driver async như asyncpg hoặc aiomysql, đồng thời đặt pool size phù hợp với số worker Uvicorn để tránh cạn kết nối.
Câu hỏi thường gặp
FastAPI có thay thế Django không?
Không hoàn toàn. Django đi kèm ORM, admin panel, hệ thống auth và quản trị nội dung, phù hợp với website hoàn chỉnh. FastAPI mạnh ở lớp API, microservice và làm backend cho mobile app hoặc SPA.
Background task có đáng dùng không?
Có, FastAPI cung cấp BackgroundTasks để chạy job sau khi trả response, chẳng hạn gửi email xác nhận. Nhưng với tác vụ nặng nên đẩy sang hàng đợi như Celery, RQ hay RabbitMQ.
Có chạy được trên serverless không?
Được. Nhiều nền tảng cung cấp sẵn ASGI handler cho FastAPI. Lưu ý thời gian khởi động lạnh (cold start) và giới hạn thời gian thực thi của gói free.
Kết luận
FastAPI đã trở thành lựa chọn mặc định cho API Python hiện đại nhờ tốc độ, type safety và tài liệu tự sinh. Bắt đầu bằng việc làm quen type hint và Pydantic, sau đó mới mở rộng tới dependency injection và cơ sở dữ liệu sẽ tự nhiên hơn nhiều. Tham khảo thêm tài liệu chính thức tại fastapi.tiangolo.com/tutorial.
