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
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
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
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
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.
Trả lời vài câu để chắc rằng em đã nắm bài.
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
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
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:
mypy0 lỗi;pytestxanh; CI tự chạy khi push - như dự án chuyên nghiệp. - 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
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.