FastAPI là gì? Hướng dẫn xây dựng REST API cơ bản cho người mới

FastAPI là gì và tại sao nên chọn FastAPI?

FastAPI là một framework web Python hiệu suất cao, được thiết kế để xây dựng REST API một cách nhanh chóng và đáng tin cậy. Tạo bởi Sebastián Ramírez, FastAPI sử dụng Starlette cho phần xử lý request và Pydantic cho việc validation dữ liệu, mang lại tốc độ tương đương Node.js hay Go (fastapi.tiangolo.com).

Trong bối cảnh phát triển API hiện đại, FastAPI nổi bật nhờ ba ưu điểm chính:

  • Tốc độ cao: Nhanh ngang ngửa FastAPI so với NodeJS, Starlette và chỉ chậm hơn ~2-3% so với raw Starlette nhờ ASGI backend (Benchmarks FastAPI).
  • Tự động sinh tài liệu: Swagger UI và ReDoc được tích hợp sẵn, không cần cấu hình thêm.
  • Hỗ trợ type hints: Sử dụng Python type hints để validate, serialize và deserialize dữ liệu tự động.

Cài đặt và thiết lập môi trường

Bắt đầu với FastAPI cực kỳ đơn giản. Bạn chỉ cần cài đặt hai package chính:

pip install fastapi uvicorn

Trong đó:

  • fastapi — framework chính cung cấp các decorator và tiện ích.
  • uvicorn — ASGI server để chạy ứng dụng trong môi trường development.

Để chạy server development, sử dụng lệnh:

uvicorn main:app --reload

Tham số --reload giúp server tự động restart khi có thay đổi code, rất tiện lợi khi đang phát triển (FastAPI First Steps).

Xây dựng REST API đầu tiên

Một ứng dụng FastAPI cơ bản chỉ cần vài dòng code:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
name: str
email: str
age: int | None = None

users_db: list[dict] = []

@app.get("/users")
def get_users():
return users_db

@app.post("/users")
def create_user(user: User):
users_db.append(user.model_dump())
return {"message": "Tạo thành công", "data": user}

Khi chạy và truy cập http://127.0.0.1:8000/docs, bạn sẽ thấy Swagger UI với toàn bộ API được mô tả sẵn. Đây là một trong những tính năng mạnh mẽ nhất của FastAPI — tài liệu API luôn đồng bộ với code thực tế (Interactive API Docs).

Các HTTP methods trong FastAPI

FastAPI hỗ trợ đầy đủ các HTTP methods phổ biến cho REST API:

GET — Đọc dữ liệu

@app.get("/users/{user_id}")
def get_user(user_id: int):
for user in users_db:
if user["age"] is not None and user.get("id") == user_id:
return user
return {"error": "Không tìm thấy"}

POST — Tạo mới

@app.post("/users")
def create_user(user: User):
user_data = user.model_dump()
user_data["id"] = len(users_db) + 1
users_db.append(user_data)
return user_data

PUT — Cập nhật toàn bộ

@app.put("/users/{user_id}")
def update_user(user_id: int, user: User):
for i, u in enumerate(users_db):
if u.get("id") == user_id:
user_data = user.model_dump()
user_data["id"] = user_id
users_db[i] = user_data
return user_data
return {"error": "Không tìm thấy"}

DELETE — Xóa

@app.delete("/users/{user_id}")
def delete_user(user_id: int):
for i, u in enumerate(users_db):
if u.get("id") == user_id:
users_db.pop(i)
return {"message": "Đã xóa"}
return {"error": "Không tìm thấy"}

Mỗi route tương ứng một HTTP method rõ ràng, giúp code dễ đọc và maintain (Path Parameters).

Validation dữ liệu với Pydantic

FastAPI sử dụng Pydantic BaseModel để validate dữ liệu đầu vào. Khi client gửi request với dữ liệu sai kiểu, hệ thống tự động trả về lỗi 422 với thông báo chi tiết:

class Product(BaseModel):
name: str
price: float
description: str = "Không có mô tả"
in_stock: bool = True

@app.post("/products")
def create_product(product: Product):
return product.model_dump()

Các quy tắc validation bao gồm:

  • Bắt buộc: str, int, float — không có giá trị mặc định thì bắt buộc truyền vào.
  • Tùy chọn: str = "default" — có thể bỏ qua khi gọi API.
  • Kiểm tra kiểu: Nếu truyền string thay cho int, FastAPI trả lỗi 422 với message rõ ràng.
  • Nested models: Có thể lồng BaseModel bên trong BaseModel để cấu trúc dữ liệu phức tạp.

Tính năng này giúp giảm thiểu lỗi runtime và tăng độ ổn định cho ứng dụng (Body Multiple Params).

Middleware và CORS

Khi frontend gọi API từ domain khác, bạn cần cấu hình CORS (Cross-Origin Resource Sharing):

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)

Middleware trong FastAPI chạy trước khi request đến handler và sau khi response được tạo, thuận tiện cho logging, authentication hay rate limiting (Advanced Middleware).

Kết nối cơ sở dữ liệu

Trong thực tế, API cần kết nối database. FastAPI hỗ trợ nhiều ORM và driver phổ biến:

  • SQLAlchemy — ORM truyền thống, ổn định và nhiều extension.
  • Tortoise ORM — async-native, tương thích tốt với FastAPI.
  • Prisma — thế hệ mới, type-safe và dễ dùng.
  • MongoDB Motor — driver async chính thức cho MongoDB.

Ví dụ với SQLAlchemy:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import Session, DeclarativeBase

DATABASE_URL = "sqlite:///./app.db"
engine = create_engine(DATABASE_URL)

class Base(DeclarativeBase):
pass

class UserDB(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String)

Flyway cũng cung cấp dependency injection để quản lý session database một cách tự động (SQL Databases).

Triển khai production

Để đưa API vào production, bạn cần lưu ý:

  • Không dùng --reload — chỉ dành cho development.
  • Sử dụng Gunicorn + Uvicorn workers: gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker
  • Cấu hình môi trường: Dùng python-dotenv hoặc hệ thống env vars để quản lý secrets.
  • Docker: FastAPI có image chính thức trên Docker Hub, giúp triển khai nhất quán (FastAPI Docker).
  • HTTPS: Luôn sử dụng HTTPS thông qua reverse proxy như Nginx hoặc Traefik.

Tài nguyên tham khảo

Để tìm hiểu sâu hơn về FastAPI, bạn nên tham khảo:

FastAPI đang trở thành lựa chọn hàng đầu cho REST API trong Python ecosystem nhờ tốc độ, tính năng tự động hóa và trải nghiệm developer tuyệt vời. Bắt đầu với các endpoint đơn giản, dần mở rộng với authentication, database và deployment — đó là lộ trình hiệu quả nhất để làm chủ framework này.

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

GraphQL là gì? So sánh GraphQL và REST API khi nào nên dùng

GraphQL đang trở thành lựa chọn phổ biến cho các dự án API hiện đại, nhưng REST vẫn là tiêu chuẩn được dùng rộng rãi nhất. Bài viết này so…

Xem thêm

JavaScript cơ bản cho người mới: Hướng dẫn từ con số không

JavaScript là gì? JavaScript là ngôn ngữ lập trình phổ biến nhất thế giới, chạy trên mọi trình duyệt và cả phía máy chủ với Node.js. Nếu bạn muốn bắt…

Xem thêm

Testing trong lập trình: Unit test, integration test và cách áp dụng

Testing trong lập trình là kỹ năng phân biệt giữa code chạy được và code chạy đúng. Bất kỳ ai viết code đều cần hiểu rõ các loại test và…

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