Wavi Books · Python & Tự động hóa

FastAPI là gì? Hướng dẫn xây REST API bằng Python cho người mới

Nguyễn Minh Trí · Biên tập chuyên môn Wavi Books

FastAPI là gì – bài hướng dẫn tiếng Việt dành cho developer và người học IT tại Việt Nam

FastAPI là gì, cách tạo REST API bằng Python, Pydantic, Uvicorn, validation và lộ trình xây backend thực tế cho người mới.

## FastAPI là gì

## Hiểu nhanh trước khi mở notebook

FastAPI là gì, cách tạo REST API bằng Python, Pydantic, Uvicorn, validation và lộ trình xây backend thực tế cho người mới. Giá trị của Python nằm ở quy trình có thể chạy lại và kiểm tra, không chỉ ở việc viết ít dòng code hơn.

Khoảnh khắc một đoạn Python nhỏ thay thế được công việc lặp lại mỗi ngày thường rất đã. Nhưng script chỉ thật sự có giá trị khi người khác chạy lại được, lỗi được nhìn thấy và dữ liệu đầu vào xấu không âm thầm tạo ra kết quả sai.

Khoảnh khắc một đoạn Python nhỏ trở thành API để ứng dụng khác có thể sử dụng luôn tạo cảm giác rất thú vị. FastAPI làm bước chuyển ấy gọn hơn, nhưng một API tốt vẫn cần nhiều hơn vài decorator.

FastAPI là web framework Python hiện đại để xây API, tận dụng type hint để validation dữ liệu và tự sinh tài liệu OpenAPI. Framework phù hợp cho backend, dịch vụ dữ liệu và lớp API của ứng dụng AI.

Điểm mạnh của FastAPI là cú pháp rõ, hỗ trợ async và tài liệu tương tác. Tuy nhiên, một API chạy được chưa đồng nghĩa với hệ thống sẵn sàng vận hành; developer vẫn cần hiểu HTTP, database, bảo mật và kiểm thử.

## Những khái niệm cốt lõi cần nắm

## FastAPI dễ bắt đầu, thiết kế API mới là phần cần kiên nhẫn

Bạn có thể xem FastAPI như lớp cửa tiếp nhận yêu cầu: kiểm tra dữ liệu, chuyển việc cho phần nghiệp vụ rồi trả phản hồi đúng quy ước. Type hint và validation giúp cánh cửa này rõ ràng hơn, không thay thế cách tổ chức ứng dụng phía sau.

## Chuyện gì xảy ra khi đem vào dự án thật?

Dự án thường bắt đầu với một file duy nhất và chạy rất ổn. Khi route, truy vấn dữ liệu và nghiệp vụ dồn vào cùng nơi, mỗi thay đổi nhỏ lại kéo theo nỗi lo làm hỏng phần khác.

## Nếu bắt đầu hôm nay, tôi sẽ làm thế này

Hãy tách route, schema và service từ khi dự án bắt đầu có nhiều hơn vài endpoint. Cấu trúc vừa đủ sẽ giúp người mới đọc được code mà không biến ứng dụng nhỏ thành một mê cung.

- Route và HTTP method mô tả tài nguyên.

- Pydantic kiểm tra request và response.

- Dependency injection quản lý thành phần dùng chung.

- Uvicorn chạy ứng dụng theo chuẩn ASGI.

## Lộ trình thực hành từng bước

- Bước 1: Tạo CRUD API nhỏ với schema rõ ràng.

- Bước 2: Kết nối database và viết test cho endpoint.

- Bước 3: Thêm authentication, logging, Docker và triển khai thử.

## Những sai lầm thường gặp

- Dùng async nhưng gọi thư viện blocking.

- Trả lỗi không nhất quán.

- Đưa khóa bí mật trực tiếp vào mã nguồn.

## Góc nhìn dành cho người học và developer Việt Nam

Người học Python tại Việt Nam có thể dùng FastAPI để làm portfolio backend hoặc bọc mô hình AI thành dịch vụ, nhưng nên công khai tài liệu API và test thay vì chỉ quay video demo.

## Nên học tiếp như thế nào?

## FastAPI xử lý một request như thế nào?

Khi client gửi request, ASGI server như Uvicorn nhận kết nối rồi chuyển scope, receive và send cho ứng dụng. FastAPI tìm route, giải dependency, đọc path/query/header/body, dùng Pydantic validation, chạy handler và serialize response. Hiểu luồng này giúp bạn biết lỗi 422 xuất hiện ở validation, lỗi 500 ở logic hay timeout ở dependency bên ngoài.

Type hint trong FastAPI không chỉ để IDE gợi ý. Nó là hợp đồng dữ liệu cho validation, OpenAPI và tài liệu. Tuy nhiên schema API không nên dùng trực tiếp model ORM; tách request/response schema giúp tránh lộ trường nội bộ và cho phép API tiến hóa độc lập với database.

## Xây API có cấu trúc thay vì dồn vào một file

Một dự án vừa nên chia router, schema, service, repository, model, config và test. Router xử lý giao thức HTTP; service chứa luật nghiệp vụ; repository làm việc với dữ liệu. Không cần áp dụng kiến trúc nặng cho demo nhỏ, nhưng phải giữ logic nghiệp vụ ra khỏi route để test dễ hơn.

```python from fastapi import APIRouter, Depends, HTTPException, status router = APIRouter(prefix="/books", tags=["books"]) @router.get("/{book_id}", response_model=BookResponse) async def get_book(book_id: int, service: BookService = Depends(get_service)): book = await service.find_by_id(book_id) if book is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Book not found") return book ```

Handler trên ngắn vì việc tìm sách nằm trong service. Khi đổi database hoặc thêm cache, hợp đồng HTTP ít bị ảnh hưởng. Response model là lớp bảo vệ để chỉ trả trường được phép.

## Async: nhanh hơn khi nào, chậm hơn khi nào?

Async hữu ích khi request chờ database, HTTP hoặc file I/O có thư viện bất đồng bộ. Nó không làm tác vụ CPU-bound như xử lý ảnh hay inference nặng nhanh hơn. Nếu gọi thư viện blocking trong async handler, event loop vẫn bị chặn. Tác vụ CPU nặng nên chuyển sang worker, process pool hoặc dịch vụ chuyên biệt.

Đừng dùng async chỉ vì framework hỗ trợ. Hãy đo concurrency, p95 latency và số connection. Database pool quá nhỏ tạo hàng đợi; pool quá lớn có thể làm database quá tải. Tối ưu một tầng mà bỏ qua giới hạn tầng sau thường không cải thiện hệ thống.

## Authentication và phân quyền

JWT chỉ là định dạng token, không tự tạo bảo mật. Cần kiểm tra chữ ký, issuer, audience, expiry và chiến lược revoke/refresh. Authentication trả lời người dùng là ai; authorization trả lời họ được làm gì trên tài nguyên nào. Phân quyền nên nằm trong dependency hoặc service, không rải điều kiện tùy ý ở nhiều route.

## Kiểm thử theo ba lớp

- Unit test cho service với repository giả.

- Integration test cho API và database thử nghiệm.

- Contract test kiểm tra schema, status code và tương thích client.

Test cần bao phủ dữ liệu sai, không có quyền, resource không tồn tại, xung đột và timeout. Chỉ test happy path tạo cảm giác an toàn giả.

## Danh sách kiểm tra production

- Cấu hình qua environment và secret manager, không ghi khóa vào code.

- Có request ID, structured log, metric, trace và endpoint health/readiness.

- Đặt timeout cho HTTP, database; retry có backoff và chỉ dùng khi thao tác an toàn.

- Giới hạn body, rate limit, CORS và security header phù hợp.

- Chạy migration có chiến lược rollback và kiểm thử tương thích schema.

- Dùng nhiều worker theo tải và benchmark trước khi chọn con số.

## Bài tập nâng cấp

Xây API quản lý thư viện có đăng nhập, phân quyền admin/user, tìm kiếm, pagination và lịch sử mượn. Viết test cho transaction mượn sách, thêm Redis cache cho chi tiết sách, chạy job nền gửi nhắc hạn và triển khai bằng Docker. Đây là dự án đủ rộng để thể hiện backend thay vì chỉ CRUD.

## Góc nhìn dành cho developer Việt Nam

Với người mới học Python tại Việt Nam, hãy chọn một việc gần với công việc hoặc học tập của mình: xử lý file, làm sạch bảng dữ liệu, gọi API hay tạo báo cáo. Một dự án nhỏ chạy được từ đầu đến cuối thường giúp tiến bộ nhanh hơn việc học thuộc nhiều cú pháp rời rạc.

## Đọc tiếp trên Wavi Books

Nếu bạn muốn học chủ đề này theo một lộ trình có cấu trúc, có thể xem Python Crash Course, 3rd Edition bản tiếng Việt tại [Wavi Books](/sach/python-crash-course-eric-matthes-2026). Sách liên quan được đặt sau phần kiến thức để bạn có thể đánh giá nội dung trước khi chọn mua.

Nguồn tham khảo và tài liệu đối chiếu

  1. Python 3 documentation
  2. Python Packaging User Guide
  3. FastAPI documentation

Sách liên quan

Câu hỏi thường gặp

FastAPI là gì có phù hợp với người mới không?

Có, nếu bắt đầu từ khái niệm nền tảng và một bài tập nhỏ. Người mới nên ưu tiên hiểu luồng dữ liệu, mục tiêu và cách kiểm tra kết quả trước khi học công cụ nâng cao.

Mất bao lâu để áp dụng fastapi là gì vào dự án?

Thời gian phụ thuộc nền tảng và phạm vi. Một bản thử nghiệm nhỏ có thể hoàn thành trong vài ngày, nhưng để vận hành ổn định cần thêm kiểm thử, bảo mật, theo dõi và tài liệu.

Nên học lý thuyết hay làm dự án trước?

Nên học vừa đủ lý thuyết để hiểu quyết định, sau đó làm dự án và quay lại đào sâu phần gây lỗi. Cách học lặp này hiệu quả hơn việc chỉ đọc hoặc chỉ sao chép mã.