← Lập trình Python nâng cao

Bài 16 · Nâng cao · 34 phút· Cập nhật 11/06/2026

Dự án cuối khoá: 3 dự án

Biên soạn bởi Nguyễn Anh Tuấn

Ba dự án Python nâng cao khép khoá: trình thu thập web đồng thời (async), app CLI + SQLite có test, và một dịch vụ/API async với FastAPI.

Giờ là lúc ghép tất cả thành sản phẩm thật. Ba dự án dưới đây xây chồng lên nhau, dùng kỹ năng nâng cao đã học (async, SQLite, kiểm thử, type hints, chịu lỗi). Mỗi dự án có khối “Hoàn thành khi” để tự chấm.

dựng dự án bằng uv

uv init duan-nang-cao && cd duan-nang-cao
uv add httpx                 # Du an 1 (async HTTP)
uv add --dev pytest mypy     # Du an 2 (test + go kieu)
uv add fastapi uvicorn       # Du an 3 (API async)
# chay:  uv run python app.py | uv run pytest | uv run mypy .
  • Làm trên repo riêng; commit từng dự án; có README hướng dẫn chạy.
  • Dùng uv cho môi trường & thư viện; sqlite3 có sẵn (khỏi cài).
  • Mục tiêu mỗi dự án: chạy được + có TEST + mypy sạch (chuẩn nghề).

Mục tiêu: tải nhiều trang/API cùng lúc bằng async, chịu lỗi mạng, rồi lưu vào SQLite. (Dùng bài async/await, Internet & HTTP, Cơ sở dữ liệu.)

  • Async: httpx.AsyncClient + asyncio.gather/TaskGroup để tải đồng thời (nhanh hơn tuần tự rõ rệt).
  • Chịu lỗi: timeout cho mọi lời gọi; retry + backoff cho lỗi tạm thời; phân trang bằng generator.
  • Lưu trữ: SQLite tham số hoá; transaction khi ghi loạt; index cho cột hay truy vấn.
  • Tách lớp: gọi-mạng riêng, xử-lý riêng, lưu-trữ riêng → dễ test.

Hoàn thành khi

Tải ≥ 10 nguồn đồng thời bằng async (đo được nhanh hơn bản tuần tự); có timeout + retry cho lỗi tạm thời; dữ liệu lưu vào SQLite (tham số hoá, có index); và phần XỬ LÝ có test không phụ thuộc mạng (fake/monkeypatch).

Mục tiêu: một ứng dụng dòng lệnh quản lý dữ liệu (vd quản lý công việc/chi tiêu) lưu SQLite, có kiểm thử đầy đủ. (Dùng bài type hints, unit/integration test, Cơ sở dữ liệu, OOP/dataclass.)

  • Mô hình dữ liệu bằng @dataclass; type hints cho mọi hàm công khai; mypy sạch.
  • Lưu trữ SQLite: tham số hoá, transaction; tách lớp Model · Store · CLI (dễ test).
  • Unit test: logic nghiệp vụ (happy/edge/error, parametrize, pytest.raises).
  • Integration test: round-trip lưu/đọc + DB tạm (transaction rollback mỗi test).

Hoàn thành khi

CLI chạy được các thao tác CRUD trên SQLite; mypy 0 lỗi; có cả unit (logic) và integration (DB round-trip) test, tất cả xanh; truy vấn đều tham số hoá.

Mục tiêu: đưa dữ liệu ra ngoài (vd từ Dự án 2) qua một API async. (Dùng bài Internet & HTTP, async/await, type hints, kiểm thử.)

  • FastAPI: route async (async def), dùng type hints để validate dữ liệu vào & sinh tài liệu.
  • REST: GET /items (200), POST /items (201), DELETE /items/{id} (204); xử lý 404/4xx tử tế.
  • Đồng thời: tận dụng async cho các thao tác I/O (DB/HTTP) trong endpoint.
  • Test: dùng client test của FastAPI để kiểm endpoint (status + body), không cần chạy server thật.

Hoàn thành khi

API chạy (uv run uvicorn app:app) với ≥ 3 route REST đúng method & status; route dùng async cho I/O; có test endpoint xanh; tài liệu API tự sinh xem được ở /docs.

Bạn đã đi từ OOP & mô hình dữ liệu tới async, free-threading và một API chạy được - qua iterator/generator, decorator/closure, type hints, kiểm thử, tệp/DB/HTTP, GIL & đồng thời. Quan trọng hơn mọi tính năng: bạn giữ được tư duy “nắm bản chất” - hiểu Python THỰC SỰ chạy thế nào - và thói quen type hints + test + kiểm chứng.

Đi tiếp

Áp dụng vào dự án thật là cách học nhanh nhất. Hướng mở rộng: gói & phát hành (packaging), profiling & tối ưu, async/đồng thời nâng cao, một framework web đầy đủ. Và luôn: đo trước khi tối ưu, kiểm chứng trước khi tin.

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

Nên làm theo thứ tự: Dự án 1 (async + sqlite + chịu lỗi) → Dự án 2 (CLI + test + type) → Dự án 3 (API async, gộp tất cả). Mỗi dự án có khối “Hoàn thành khi” để tự chấm. Làm tới đâu chắc tới đó; mỗi dự án đều là một sản phẩm độc lập để khoe.

Dùng uv cho gọn: uv init duan; cd duan; uv add httpx (Dự án 1), uv add --dev pytest mypy (Dự án 2), uv add fastapi uvicorn (Dự án 3). Chạy: uv run python app.py / uv run pytest / uv run uvicorn app:app. sqlite3 có sẵn, khỏi cài.

Đạt hết các gạch trong khối “Hoàn thành khi” (Definition of Done) của dự án đó. Tốt hơn nữa: có test xanh, mypy sạch, và commit vào git để có bằng chứng + có thể quay lại.

Tách phần GỌI MẠNG (client async) khỏi phần XỬ LÝ (parse, lọc, lưu). Test phần xử lý bằng dữ liệu mẫu; test phần mạng bằng monkeypatch/fake client (bài integration test). Đừng để bộ test gọi internet thật.

Áp dụng vào dự án thật của bạn - và đóng gói một phần thành thư viện tái dùng (bài “Tự viết & đóng gói thư viện” trong khoá này). Học sâu thêm: profiling & tối ưu, async nâng cao, hoặc một framework web (FastAPI/Django). Và luôn giữ thói quen: type hints + test + kiểm chứng.

Bài Tự viết & đóng gói thư viện (packaging) →

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

Dự án 1 (trình thu thập web đồng thời) chủ yếu dựa trên kỹ thuật nào để nhanh hơn bản tuần tự?

  1. 1

    Bộ sản phẩm

    Hoàn thiện ít nhất 2/3 dự án, đưa lên GitHub, mỗi dự án có README (cách chạy) + test.

    Hoàn thành khi: Repo gọn gàng, chạy được theo README, test xanh - portfolio Python nâng cao của bạn.

  2. 2

    Cổng chất lượng

    Cho dự án bạn chọn: thêm mypy (gõ kiểu), pytest (test), và một bước CI chạy cả hai.

    Hoàn thành khi: mypy 0 lỗi; pytest xanh; CI tự chạy khi push - như dự án chuyên nghiệp.

  3. 3

    Đo & kể

    Với Dự án 1, đo thời gian thu thập KHI tuần tự vs đồng thời (gather). Ghi lại con số.

    Hoàn thành khi: Bản async nhanh hơn rõ; bạn giải thích vì sao (chồng lấn I/O trên một luồng).

  4. 4

    Chia sẻ

    Viết một ghi chú ngắn (hoặc bài đăng) về điều khó & điều tâm đắc khi làm; kèm #meohamhoc.

    Hoàn thành khi: Một chia sẻ trung thực giúp người khác và củng cố hiểu biết của bạn.