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:

text
api-manajemen-tugas/
├── pyproject.toml
└── app/
    ├── __init__.py
    └── main.py

Tiga 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 #

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:

bash
pip install fastapi uvicorn pytest httpx

Aplikasi Minimal #

Berkas app/__init__.py dibiarkan kosong. Selanjutnya, isi app/main.py dengan aplikasi pertama kita:

python
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_store

Mari kita telaah perannya baris per baris:

  1. app = FastAPI(title=..., version=...): membuat instance aplikasi sekaligus mengisi judul dan versi yang nanti muncul di dokumentasi OpenAPI.
  2. 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.
  3. @app.get("/health"): endpoint kesehatan yang mengembalikan {"status": "ok"} — titik pemeriksaan standar untuk load balancer dan monitoring.
  4. @app.get("/tugas"): mengembalikan seluruh isi tugas_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:

python
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:

text
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:

bash
python -m uvicorn app.main:app --port 8123

Output yang Dihasilkan:

text
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:

bash
curl http://127.0.0.1:8123/health
curl http://127.0.0.1:8123/tugas

Output yang Dihasilkan:

text
{"status":"ok"}
[]

Terminal uvicorn kini menampilkan jejak kedua permintaan tersebut, lalu server kita matikan dengan Ctrl+C:

text
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/main.py

Unduh berkas
python
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_store

pyproject.toml

Unduh berkas
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",
]