FastAPI là gì? Framework Python hiện đại để xây dựng API

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 uvloop và httptools có 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 /docs và /redoc mà không cần viết tay.
Giao diện tài liệu REST API kiểu Swagger hiển thị bảng tham số yêu cầu và kiểu dữ liệu đầu vào
Giao diện tài liệu REST API kiểu Swagger hiển thị bảng tham số yêu cầu và kiểu dữ liệu đầu vào

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.

Ảnh chụp Swagger UI liệt kê các endpoint REST kèm mô tả tham số và phản hồi
Ảnh chụp Swagger UI liệt kê các endpoint REST kèm mô tả tham số và phản hồi
Sơ đồ ánh xạ các trường trong định nghĩa OpenAPI sang giao diện Swagger UI
Sơ đồ ánh xạ các trường trong định nghĩa OpenAPI sang giao diện Swagger UI

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.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Vite là gì? Dev server siêu tốc cho lập trình viên JavaScript

Vite là công cụ build phía dev server dành cho lập trình viên JavaScript và TypeScript, được Evan You tạo ra sau khi rời dự án Vue.js. Điểm mạnh cốt…

Xem thêm

Raft là gì: Thuật toán đồng thuận cho hệ thống phân tán

Thuật toán Raft là gì: Giải pháp đồng thuận dễ hiểu cho các hệ thống phi tập trung Thuật toán Raft là gì? Đây là một giao thức đồng thuận…

Xem thêm
Sơ đồ khối OLAP cube ba chiều minh họa cách tổ chức dữ liệu phân tích trong DuckDB

DuckDB là gì: Cơ sở dữ liệu phân tích nhúng cho lập trình viên

DuckDB là hệ thống quản lý CSDL quan hệ định hướng cột (column-oriented RDBMS) mã nguồn mở, được thiết kế để tối ưu hiệu năng cho các truy vấn phức…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất