- FastAPI là gì và khi nào nên dùng?
FastAPI là framework Python để xây dựng HTTP API, dựa trên type hints, Starlette và Pydantic. Nó phù hợp khi cần API typed, tài liệu OpenAPI tự động, validation rõ ràng, hiệu năng tốt và developer experience dễ chịu. Nên dùng FastAPI cho REST API,…
- Path operation trong FastAPI là gì?
Path operation là function gắn với một HTTP method và path, ví dụ GET /users/{id} hoặc POST /orders. FastAPI đọc type hints từ function parameters để parse path params, query params, body, header, cookie và validate tự động. Điểm mạnh là route handler vừa là…
- Pydantic model trong FastAPI dùng để làm gì?
Pydantic model định nghĩa schema cho request body, response, settings hoặc object trung gian. FastAPI dùng model để validate input, serialize output và sinh OpenAPI schema. Model nên tách theo use-case: UserCreate cho input tạo mới, UserRead cho response, UserUpdate cho partial update. Không nên…
- FastAPI tự sinh OpenAPI docs như thế nào?
FastAPI sinh OpenAPI từ path operations, type hints, Pydantic models, status codes, dependencies và metadata. Mặc định app có Swagger UI ở /docs và ReDoc ở /redoc. Docs tự động chỉ đáng tin khi contract được viết rõ: đặt response model, status code đúng, mô…
- Request body, path params và query params trong FastAPI được phân biệt thế nào?
FastAPI phân biệt dựa trên vị trí khai báo và type: parameter có trong path template là path param; primitive parameter không nằm trong path thường là query param; Pydantic model thường là request body. Ví dụ: Trong API public, nên đặt validation constraints rõ…
- `response_model` giải quyết vấn đề gì?
responsemodel ép output theo schema đã khai báo: validate/serialize response, lọc field không được expose và sinh OpenAPI chính xác. Ví dụ tránh trả password hash: Không nên dựa vào việc route handler vô tình không trả field nhạy cảm; hãy để schema response làm…
- Dependency Injection trong FastAPI hoạt động thế nào?
FastAPI dependency là callable được khai báo bằng Depends hoặc Security. FastAPI tự gọi dependency, truyền request params cần thiết, cache kết quả trong request nếu cùng dependency được dùng nhiều lần, rồi inject kết quả vào handler. Ví dụ: Dependency phù hợp cho auth,…
- Dependency với `yield` dùng khi nào?
Dependency dùng yield phù hợp cho resource có setup/cleanup như database session, transaction, file handle hoặc external client. Code trước yield chạy trước handler, code sau yield chạy sau response path operation hoàn tất hoặc khi có exception. Ví dụ DB session: Không nên tạo…
- `async def` và `def` route trong FastAPI khác nhau thế nào?
async def chạy trong event loop và phù hợp khi handler await async I/O như async database driver, HTTP client hoặc message broker. def sync handler được chạy trong threadpool để không block event loop. Sai lầm thường gặp là viết async def nhưng gọi…
- APIRouter dùng để tổ chức FastAPI app như thế nào?
APIRouter gom routes theo feature/module, cho phép đặt prefix, tags, dependencies và responses chung. Root app include router qua app.includerouter(). Ví dụ: App lớn nên tách theo domain như users, orders, billing, không tách theo technical layer kiểu tất cả controllers chung một file.
- Pydantic v2 ảnh hưởng gì tới FastAPI code?
FastAPI dùng Pydantic để validate và serialize dữ liệu, nên cần nắm các API chính của Pydantic version đang dùng trong dự án. Với Pydantic v2, các điểm hay gặp là modelconfig, modelvalidate(), modeldump() và validators bằng @fieldvalidator/@modelvalidator. Ví dụ: Khi review FastAPI code, cần…
- Partial update/PATCH trong FastAPI nên thiết kế thế nào?
PATCH nên dùng model riêng với fields optional, sau đó chỉ apply field nào client gửi. Với Pydantic v2, modeldump(excludeunset=True) giúp phân biệt field không gửi với field gửi giá trị null. Ví dụ: Không nên reuse model create cho PATCH vì create thường required…
- FastAPI xử lý lỗi validation và business errors như thế nào?
Lỗi validation request tự động trả 422 với chi tiết field lỗi. Business error nên dùng HTTPException hoặc custom exception + exception handler để response nhất quán. Ví dụ: Không nên trả { "error": ... } thủ công với status 200. API client cần status…
- OAuth2/JWT trong FastAPI thường được implement thế nào?
Pattern phổ biến: login endpoint verify credentials, cấp access token ngắn hạn; protected endpoints dùng dependency đọc Bearer token, verify signature/expiry, load user và inject currentuser. Ví dụ dependency rút gọn: Trong production cần refresh token, revoke/session strategy, password hashing mạnh, rotation secret/key và phân…
- CORS trong FastAPI cần cấu hình ra sao?
CORS được cấu hình bằng CORSMiddleware. Không nên dùng wildcard origin cùng credentials trong production; hãy whitelist domain cụ thể theo môi trường. Ví dụ: CORS chỉ là chính sách browser, không phải security boundary cho API. Backend vẫn phải authenticate và authorize request.
- FastAPI tích hợp SQL database nên quản lý session thế nào?
Mỗi request nên có session scope riêng, thường tạo bằng dependency yield. Service/repository nhận session qua dependency hoặc qua function parameter, commit/rollback ở layer rõ ràng. Ví dụ: Tránh global session dùng chung nhiều request. Với SQLAlchemy async, cần dùng async engine/driver tương ứng như…
- BackgroundTasks trong FastAPI dùng cho việc gì?
BackgroundTasks chạy task sau khi response đã gửi, phù hợp cho việc nhẹ như gửi email, ghi audit log hoặc gọi webhook không critical. Nó không thay thế queue thật. Ví dụ: Nếu task cần retry, scheduling, durability hoặc chạy lâu, nên dùng Celery/RQ/Arq, message…
- Middleware trong FastAPI dùng khi nào?
Middleware bọc toàn bộ request/response, phù hợp cho cross-cutting concern như request id, logging, timing, CORS, compression, trusted host hoặc security headers. Ví dụ timing middleware: Không nên nhét business logic vào middleware vì nó thiếu context của route handler và khó test theo domain.
- Lifespan/startup-shutdown trong FastAPI dùng để làm gì?
Lifespan quản lý resource cấp app như connection pool, cache client, ML model hoặc scheduler. Code trước yield chạy khi app startup, code sau yield chạy khi shutdown, giúp mở và đóng resource đúng vòng đời. Ví dụ: Không nên tạo resource nặng ở global…
- Test FastAPI endpoint nên viết như thế nào?
Với endpoint sync/normal, dùng TestClient. Với async test cần gọi async DB/client, dùng pytest.mark.anyio và httpx.AsyncClient hoặc ASGI transport. Ví dụ override dependency: Test tốt nên cover status code, response schema, auth path, validation lỗi 422 và side effect quan trọng.
- Test database với FastAPI cần lưu ý gì?
Không nên để test dùng chung production database. Dùng test database riêng, transaction rollback, fixture tạo schema, hoặc container database tuỳ mức integration. Với dependency DB session, test có thể override dependency để inject session test: Cần đảm bảo isolation giữa tests: reset data, rollback…
- ASGI và Uvicorn liên quan gì tới FastAPI?
FastAPI là ASGI application; ASGI là interface cho Python async web apps. Uvicorn là ASGI server phổ biến dùng để chạy FastAPI, nhận HTTP/WebSocket request và gọi app theo ASGI protocol. Trong production, số process/workers phụ thuộc CPU, memory, blocking I/O và cách scale bằng…
- FastAPI app trong Docker nên tối ưu gì?
Docker image nên dùng base image rõ version, cài dependency có cache tốt, không chạy bằng root nếu không cần, copy source sau dependency để tận dụng layer cache, và expose healthcheck endpoint. Ví dụ command phổ biến: Trong production nên cấu hình env vars,…
- FastAPI authorization nên thiết kế theo role hay scope?
- StreamingResponse và FileResponse dùng khi nào?
StreamingResponse dùng khi response lớn hoặc sinh dần như export CSV, proxy stream, AI token stream. FileResponse dùng trả file có sẵn trên disk và xử lý headers phù hợp. Ví dụ streaming: Cần chú ý client disconnect, timeout, backpressure và không giữ toàn bộ…
- WebSocket trong FastAPI khác HTTP endpoint thế nào?
- SSE khác WebSocket trong FastAPI như thế nào?
SSE là stream một chiều từ server tới client qua HTTP, tự reconnect tốt trong browser và phù hợp notification, progress, AI token stream hoặc dashboard chỉ cần server push. WebSocket hai chiều và phù hợp khi client/server đều gửi liên tục. Nếu chỉ cần…
- File upload trong FastAPI nên dùng `bytes` hay `UploadFile`?
bytes đọc toàn bộ file vào memory, chỉ phù hợp file nhỏ. UploadFile dùng spooled file, có metadata như filename/contenttype và hỗ trợ async read, phù hợp file lớn hơn. Ví dụ: Production cần giới hạn size, validate content type thật, scan nếu cần, lưu…
- Settings và environment variables trong FastAPI nên quản lý thế nào?
Dùng Pydantic Settings hoặc pydantic-settings để parse env vars có type, default và validation. Settings nên được inject qua dependency hoặc tạo singleton cached rõ ràng. Ví dụ: Không commit secret vào repo. Tách config theo môi trường qua env vars, secret manager hoặc orchestrator…
- Observability cho FastAPI production cần những gì?
- FastAPI app bị chậm thì debug từ đâu?
- FastAPI project nên tổ chức theo layer hay theo feature?
Với app nhỏ, layer đơn giản như routers/services/repositories đủ dùng. Với app lớn, nên tổ chức theo feature/domain để giảm coupling: mỗi domain có router, schemas, service, repository và tests riêng. Quan trọng là route handler mỏng: parse request, gọi service/use-case, trả response. Business logic…
- FastAPI có nên dùng repository pattern không?
- Những lỗi security hay gặp trong FastAPI API là gì?
- FastAPI response status code nên thiết kế thế nào?
Status code nên phản ánh kết quả API: 200 cho đọc/update thành công, 201 cho create, 204 cho delete/no content, 400 cho input semantic sai, 401 chưa xác thực, 403 không đủ quyền, 404 không tồn tại, 409 conflict. Ví dụ: Không nên dùng 200…
- Tách input schema và output schema trong FastAPI khi nào?
- Transaction boundary trong FastAPI service nên đặt ở đâu?
- FastAPI API versioning nên làm như thế nào?
- Health check trong FastAPI nên tách liveness và readiness như thế nào?
Liveness trả lời câu hỏi process còn sống không, nên đơn giản và ít dependency. Readiness trả lời app đã sẵn sàng nhận traffic chưa, có thể kiểm database/cache/critical dependency. Ví dụ: Nếu readiness fail, orchestrator nên ngừng route traffic nhưng không nhất thiết restart…
- Khi nào không nên chọn FastAPI?
- Endpoint khai báo `async def` nhưng bên trong gọi `requests.get()` thì chuyện gì xảy ra?
Toàn bộ event loop bị chặn trong suốt thời gian chờ HTTP, nên mọi request khác của tiến trình đó cũng phải xếp hàng chờ theo. Lý do: hàm async def chạy trực tiếp trên event loop. Loop chỉ chuyển sang việc khác tại các…
- `Annotated[User, Depends(get_user)]` khác cách viết `user = Depends(get_user)` cũ ở chỗ nào?
Annotated đặt Depends vào phần kiểu, không phải phần giá trị mặc định. FastAPI khuyến nghị cách này từ bản 0.95.0, và Ruff có rule FAST002 để bắt cách viết cũ. Ba lợi ích thực tế: - Kiểu được giữ nguyên → editor và mypy…
- Muốn response chỉ chứa field đã thực sự được set, không kèm giá trị mặc định — làm thế nào?
Dùng responsemodelexcludeunset=True trên decorator của path operation. FastAPI sẽ serialize model bằng excludeunset, tức bỏ qua mọi field chưa được gán tường minh khi tạo object. Hai biến thể hay dùng chung: - responsemodelexcludenone=True — bỏ field có giá trị None (khác excludeunset: field set…
- Chạy FastAPI ở production có dùng `uvicorn --reload` được không? Đặt bao nhiêu worker?
Không. --reload chỉ dành cho môi trường phát triển: nó theo dõi thay đổi file và khởi động lại tiến trình, tốn CPU và kém ổn định. Production chạy nhiều worker process thay vì reload. Vì sao cần nhiều worker: một tiến trình Python chỉ…
- Endpoint khai báo `def` (không async) được FastAPI chạy ở đâu? Threadpool đó có giới hạn không?
Starlette đẩy hàm def sang một threadpool qua anyio.tothread.runsync, nên code đồng bộ không chặn event loop. Threadpool này có giới hạn: AnyIO mặc định 40 thread cho toàn tiến trình. Hệ quả khi tải cao: request thứ 41 trở đi xếp hàng chờ thread…
- Một dependency xuất hiện ở nhiều nhánh trong cùng một request có bị gọi lặp không? `use_cache` để làm gì?
Không. FastAPI cache giá trị dependency theo từng request: nếu nhiều dependency khác cùng phụ thuộc vào getsettings, hàm đó chỉ chạy một lần, kết quả được dùng lại cho mọi nhánh trong request đó. Ở ví dụ trên getdbuser chỉ truy vấn DB một…
- Trả thẳng object SQLAlchemy từ endpoint mà Pydantic v2 báo lỗi validate — cấu hình thế nào cho đúng?
Bật fromattributes=True trong modelconfig của schema. Pydantic v2 mặc định chỉ đọc dict; với ORM object nó phải được cho phép đọc thuộc tính thay vì khoá dict (v1 gọi là ormmode). Các tuỳ chọn modelconfig hay dùng kèm: - populatebyname=True — cho phép nạp…
- `field_validator` và `model_validator` khác nhau ra sao? `mode='before'` với `mode='after'` chọn cái nào?
fieldvalidator kiểm tra một field, modelvalidator kiểm tra quan hệ giữa nhiều field — ví dụ enddate phải sau startdate, hay "phải có ít nhất một trong hai số điện thoại". mode quyết định thời điểm chạy so với bước ép kiểu của Pydantic: -…
- Test endpoint async bằng `httpx.AsyncClient` + `ASGITransport` khác `TestClient` ở điểm nào?
TestClient là client đồng bộ: nó tự dựng một event loop bên trong để chạy app, nên thân test không await được các hàm async khác (gọi trực tiếp repository async, kiểm tra DB async). AsyncClient + ASGITransport giữ test nằm trong cùng một event…
- Export CSV 1 triệu dòng qua FastAPI mà không để RAM tăng đột biến — thiết kế thế nào?
Trả StreamingResponse với một generator đọc dữ liệu theo lô, thay vì dựng cả file trong bộ nhớ rồi trả một lần. Bốn điểm hay sai khi triển khai: - Vòng đời session: generator chạy sau khi handler trả về. Nếu dependency yield đóng session,…
- Vì sao dùng DB session lấy từ dependency `yield` bên trong `BackgroundTasks` lại lỗi ở FastAPI mới?
- `BaseHTTPMiddleware` khác pure ASGI middleware thế nào? Khi nào buộc phải bỏ `BaseHTTPMiddleware`?
- Async SQLAlchemy báo `MissingGreenlet: greenlet_spawn has not been called` khi đọc relationship — nguyên nhân và cách sửa?
- Client đóng kết nối giữa chừng thì FastAPI có tự dừng handler không? Xử lý thế nào cho endpoint chạy lâu?