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 #
| Aspek | Flask | Django | FastAPI |
|---|---|---|---|
| Jenis | microframework | full-stack, batteries included | framework API modern |
| Yang disediakan | routing + request handling | ORM, admin, auth, form, migrasi | validasi + dokumentasi otomatis |
| Antarmuka server | WSGI | WSGI dan ASGI | ASGI |
| Kurva belajar | paling landai di awal | paling curam di awal | landai bila type hints dikuasai |
| Kekuatan khas | kontrol penuh, bebas susun | fitur lengkap, konvensi jelas | kecepatan kerja untuk API JSON |
| Titik lemah | banyak keputusan sendiri | berat untuk proyek kecil | bukan pilihan untuk situs ber-HTML tebal |
| Cocok untuk | API kecil, prototipe, layanan mikro | aplikasi bisnis dengan banyak fitur | REST 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:
# 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:
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.