Setelah mencicipi ketiganya, pertanyaan yang pasti muncul: framework mana yang harus dipakai? Jawaban jujurnya adalah “tergantung” — dan itu bukan jawaban malas, melainkan pengakuan bahwa pilihan framework adalah keputusan arsitektur dengan banyak variabel. Chapter terakhir section ini merangkum perbandingan yang sudah kita alami sendiri, lalu menyusun kerangka berpikir agar keputusan “tergantung” bisa diambil secara objektif.

Tiga Kandidat dalam Satu Tabel #

AspekFlaskDjangoFastAPI
Jenismicroframeworkfull-stack, batteries includedframework API modern
Yang disediakanrouting + request handlingORM, admin, auth, form, migrasivalidasi + dokumentasi otomatis
Antarmuka serverWSGIWSGI dan ASGIASGI
Kurva belajarpaling landai di awalpaling curam di awallandai bila type hints dikuasai
Kekuatan khaskontrol penuh, bebas susunfitur lengkap, konvensi jelaskecepatan kerja untuk API JSON
Titik lemahbanyak keputusan sendiriberat untuk proyek kecilbukan pilihan untuk situs ber-HTML tebal
Cocok untukAPI kecil, prototipe, layanan mikroaplikasi bisnis dengan banyak fiturREST API, backend aplikasi mobile

Perhatikan bahwa kolom “titik lemah” hanyalah kebalikan dari “kekuatan khas” — setiap kelemahan framework yang satu adalah alasan framework lain dibuat.

Tiga Framework, Satu Bahasa #

Kompetensi Python yang kita bangun sejak Section Pengenalan Python tidak terbuang di framework mana pun. Kode berikut membuat rute “halo” pada ketiga framework sekaligus — termasuk Django versi minimal tanpa startproject — lalu memanggil semuanya:

python
# Flask
from flask import Flask

flask_app = Flask("demo")


@flask_app.get("/halo")
def halo_flask():
    return "Halo dari Flask!"


# FastAPI
from fastapi import FastAPI
from fastapi.testclient import TestClient

fastapi_app = FastAPI()


@fastapi_app.get("/halo")
def halo_fastapi():
    return {"pesan": "Halo dari FastAPI!"}


# Django (versi minimal, tanpa startproject)
import django
from django.conf import settings

settings.configure(DEBUG=True, ALLOWED_HOSTS=["testserver"], ROOT_URLCONF=__name__)
django.setup()

from django.http import HttpResponse
from django.urls import path


def halo_django(request):
    return HttpResponse("Halo dari Django!")


urlpatterns = [path("halo", halo_django)]

from django.test import Client

django_client = Client()

# --- eksekusi ketiganya ---
r = flask_app.test_client().get("/halo")
print("Flask  :", r.status_code, "|", r.text)

r = TestClient(fastapi_app).get("/halo")
print("FastAPI:", r.status_code, "|", r.json())

r = django_client.get("/halo")
print("Django :", r.status_code, "|", r.content.decode())

Output yang Dihasilkan:

text
Flask  : 200 | Halo dari Flask!
FastAPI: 200 | {'pesan': 'Halo dari FastAPI!'}
Django : 200 | Halo dari Django!

Tiga framework, tiga hasil berbeda, satu bahasa. Perhatikan dua hal dari kode di atas: decorator rute kini hadir di ketiganya (@flask_app.get, @fastapi_app.get, path() di Django), dan konfigurasi Django bisa dikurangi menjadi settings.configure(...) dengan ROOT_URLCONF menunjuk module tempat urlpatterns berada.

Alur Keputusan #

Diagram di atas adalah titik awal, bukan hukum. Pengalaman tim Anda juga menggeser jalurnya: tim yang sudah hafal Django membangun REST API dengan Django REST Framework lebih cepat daripada belajar FastAPI dari nol, dan itu keputusan yang sah.

Faktor Non-Teknis #

Keputusan sering kali dimenangkan oleh hal-hal di luar kode:

  • Tim saat ini dan masa depan: framework yang dikuasai kandidat kerja terbanyak memudahkan rekrutmen.
  • Ekosistem extension: kebutuhan khusus (pembayaran, OAuth, CMS) sering hanya matang di satu ekosistem.
  • Umur dokumentasi dan komunitas: ketiga framework di buku ini aktif dan terdokumentasi baik — bahan diskusi “framework X sudah mati” sebaiknya dicek ke sumber resminya.
  • Batas waktu proyek: tugas kuliah selesai lebih cepat dengan microframework; sistem internal kantor dengan banyak CRUD justru lebih cepat dengan admin Django.

Migrasi Antar Framework #

Migrasi memang langka, tetapi bukan mustahil — dan risikonya bisa ditekan sejak awal. Kuncinya: jaga logika domain (hitung diskon, validasi pesanan, aturan stok) tetap berupa module Python murni yang tidak mengimpor framework apa pun. Lapisan tipis rute-template-ORM tinggal ditulis ulang, sementara otak aplikasi berpindah utuh — pola functional core, imperative shell yang kita pelajari di Section Functional Programming.

Pada akhirnya, framework adalah alat, bukan identitas. Memahami siklus request-response (chapter Memahami Web Application), kontrak WSGI/ASGI, dan pola DI membuat kita bisa berpindah alat ketika kebutuhan berubah — dan justru pemahaman itulah, bukan kefanatikan pada satu framework, yang menjadi tanda engineer web yang matang.