Sebelum menulis satu pun endpoint bisnis, kita butuh kerangka yang bisa dijalankan: direktori yang rapi, dependensi yang tercatat, dan aplikasi FastAPI paling sederhana yang menjawab permintaan. Bagian ini menyiapkan kerangka tersebut, lalu membuktikan dua hal — bahwa API merespons lewat TestClient tanpa server, dan bahwa API juga hidup sebagai server sungguhan lewat uvicorn.
Struktur Proyek #
Buat direktori proyek dengan struktur berikut:
api-manajemen-tugas/
├── pyproject.toml
└── app/
├── __init__.py
└── main.pyTiga keputusan di sini menentukan kenyamanan seluruh proyek. Pertama, seluruh kode aplikasi tinggal di dalam package app/, bukan tercecer di root — sama seperti pola pada chapter Struktur Project Python. Kedua, berkas __init__.py yang kosong menandai app/ sebagai package agar bisa diimpor sebagai app.main. Ketiga, pyproject.toml di root menjadi satu-satunya catatan dependensi proyek.
pyproject.toml #
[project]
name = "api-manajemen-tugas"
version = "0.1.0"
description = "REST API manajemen tugas dengan FastAPI"
requires-python = ">=3.12"
dependencies = [
"fastapi>=0.128.0",
"uvicorn>=0.44.0",
]
[project.optional-dependencies]
dev = [
"httpx>=0.28.1",
"pytest>=9.0.2",
]Tabel [project] berisi metadata dan dependensi runtime: fastapi untuk framework, uvicorn untuk server ASGI. Grup dev di [project.optional-dependencies] memisahkan alat pengembangan — pembahasan lengkap format ini ada di chapter Membuat pyproject.toml.
Karena proyek ini aplikasi, bukan package yang didistribusikan ke PyPI, kita tidak membutuhkan tabel [build-system]. Pasang dependensinya di virtual environment aktif:
pip install fastapi uvicorn pytest httpxAplikasi Minimal #
Berkas app/__init__.py dibiarkan kosong. Selanjutnya, isi app/main.py dengan aplikasi pertama kita:
from fastapi import FastAPI
app = FastAPI(title="API Manajemen Tugas", version="0.1.0")
tugas_store: list[dict] = []
@app.get("/health")
def health() -> dict[str, str]:
return {"status": "ok"}
@app.get("/tugas")
def daftar_tugas() -> list[dict]:
return tugas_storeMari kita telaah perannya baris per baris:
app = FastAPI(title=..., version=...): membuat instance aplikasi sekaligus mengisi judul dan versi yang nanti muncul di dokumentasi OpenAPI.tugas_store: list[dict] = []: penyimpanan sementara untuk daftar tugas — sengaja diletakkan di sini sejak awal agar endpoint berikutnya tinggal mengisinya. Di Bagian 3 kita ganti dengan SQLite.@app.get("/health"): endpoint kesehatan yang mengembalikan{"status": "ok"}— titik pemeriksaan standar untuk load balancer dan monitoring.@app.get("/tugas"): mengembalikan seluruh isitugas_store, yang saat ini masih kosong.
Permintaan Pertama lewat TestClient #
Kita belum butuh server untuk membuktikan API hidup. Simpan sementara skrip berikut sebagai cek_api.py di root proyek:
from fastapi.testclient import TestClient
from app.main import app
client = TestClient(app)
respons = client.get("/health")
print(respons.status_code, respons.json())
respons = client.get("/tugas")
print(respons.status_code, respons.json())Output yang Dihasilkan:
200 {'status': 'ok'}
200 []TestClient memanggil aplikasi secara langsung di dalam proses yang sama, tanpa jaringan — persis pola chapter API Testing. Dua baris output di atas membuktikan routing bekerja: /health menjawab 200 dengan status ok, dan /tugas menjawab 200 dengan list kosong. Setelah yakin, skrip cek_api.py boleh dihapus — di Bagian 5 kita ganti dengan test otomatis.
Menjalankan dengan uvicorn #
Untuk server sungguhan, jalankan uvicorn dari root proyek dengan pola uvicorn app.main:app dari chapter Membuat API dengan FastAPI:
python -m uvicorn app.main:app --port 8123Output yang Dihasilkan:
INFO: Started server process [28116]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8123 (Press CTRL+C to quit)Dari terminal kedua, cek kedua endpoint dengan curl:
curl http://127.0.0.1:8123/health
curl http://127.0.0.1:8123/tugasOutput yang Dihasilkan:
{"status":"ok"}
[]Terminal uvicorn kini menampilkan jejak kedua permintaan tersebut, lalu server kita matikan dengan Ctrl+C:
INFO: 127.0.0.1:43604 - "GET /health HTTP/1.1" 200 OK
INFO: 127.0.0.1:43610 - "GET /tugas HTTP/1.1" 200 OK
INFO: Shutting down
INFO: Waiting for application shutdown.
INFO: Application shutdown complete.
INFO: Finished server process [28116]Kerangka berdiri: struktur jelas, dependensi tercatat, dan aplikasi merespons lewat TestClient maupun uvicorn. Kode lengkap tahap ini tersedia pada bagian Berkas Sumber di bawah halaman. Pada Bagian 2 kita mengisi kerangka itu dengan endpoint yang sesungguhnya: membuat, mengambil, dan menghapus tugas.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
app/__init__.py
Unduh berkasapp/main.py
Unduh berkasfrom fastapi import FastAPI
app = FastAPI(title="API Manajemen Tugas", version="0.1.0")
tugas_store: list[dict] = []
@app.get("/health")
def health() -> dict[str, str]:
return {"status": "ok"}
@app.get("/tugas")
def daftar_tugas() -> list[dict]:
return tugas_store
pyproject.toml
Unduh berkas[project]
name = "api-manajemen-tugas"
version = "0.1.0"
description = "REST API manajemen tugas dengan FastAPI"
requires-python = ">=3.12"
dependencies = [
"fastapi>=0.128.0",
"uvicorn>=0.44.0",
]
[project.optional-dependencies]
dev = [
"httpx>=0.28.1",
"pytest>=9.0.2",
]