FastAPI vs Flask: Framework Python Mana yang Harus Kamu Pilih di 2026?
Daftar Isi
- Pendahuluan
- Gambaran Singkat
- Instalasi dan Setup Project
- Routing dan Request Handling
- Validasi Data dan Serialisasi
- Async Support
- Dokumentasi Otomatis
- Autentikasi dan Middleware
- Performa
- Ekosistem dan Extensions
- Kapan Pilih Flask
- Kapan Pilih FastAPI
- Ringkasan Perbandingan
- FAQ
Pendahuluan
Python sudah lama menjadi bahasa favorit untuk membangun web service dan API. Selama bertahun-tahun, Flask menjadi pilihan utama sebagai micro-framework yang ringan dan fleksibel. Kemudian di tahun 2018, FastAPI hadir dan langsung naik daun berkat dokumentasi otomatis, performa tinggi, dan dukungan async kelas satu.
Di 2026, kedua framework ini sudah matang, aktif dipelihara, dan banyak digunakan di production. Pertanyaannya bukan lagi “mana yang lebih baik?” — melainkan “mana yang cocok untuk project Kamu?”
Artikel ini memberikan perbandingan menyeluruh agar Kamu bisa membuat keputusan yang tepat.
Gambaran Singkat
Flask
Flask dibuat oleh Armin Ronacher dan dirilis pada tahun 2010. Ini adalah micro-framework WSGI yang menganut filosofi “batteries not included”: Kamu mendapatkan routing, development server, dan templating secara bawaan, tapi untuk yang lain — akses database, autentikasi, validasi form — semuanya ditangani oleh extensions. Kesederhanaan ini membuat Flask mudah dipelajari dan sangat fleksibel.
FastAPI
FastAPI dibuat oleh Sebastián Ramírez dan dirilis pada tahun 2018. Ini adalah framework ASGI yang dibangun di atas Starlette untuk layer web dan Pydantic untuk validasi data. FastAPI memanfaatkan type hints Python untuk menyediakan validasi request otomatis, serialisasi, dan dokumentasi API interaktif tanpa konfigurasi tambahan.
Instalasi dan Setup Project
Kedua framework tersedia di PyPI dan mudah diinstal.
Flask:
pip install flask
# app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return {"message": "Halo dari Flask!"}
if __name__ == "__main__":
app.run(debug=True)
FastAPI:
pip install fastapi uvicorn
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def hello():
return {"message": "Halo dari FastAPI!"}
Jalankan FastAPI dengan:
uvicorn main:app --reload
Flask menggunakan development server bawaan dari Werkzeug; FastAPI memerlukan ASGI server seperti Uvicorn atau Hypercorn.
Routing dan Request Handling
Flask
Flask menggunakan decorator untuk mendefinisikan routes. Path parameter dibungkus dengan < > dan bisa diberi converter tipe data.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/users/<int:user_id>", methods=["GET"])
def get_user(user_id):
return jsonify({"user_id": user_id, "name": "Budi"})
@app.route("/users", methods=["POST"])
def create_user():
data = request.get_json()
# Tidak ada validasi otomatis — kamu harus check manual
name = data.get("name")
if not name:
return jsonify({"error": "name wajib diisi"}), 400
return jsonify({"name": name}), 201
FastAPI
FastAPI menggunakan decorator per HTTP method (@app.get, @app.post, dll.) dan memanfaatkan type annotation untuk path dan query parameter.
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI()
class UserCreate(BaseModel):
name: str
email: str
age: int | None = None
@app.get("/users/{user_id}")
def get_user(user_id: int):
return {"user_id": user_id, "name": "Budi"}
@app.post("/users", status_code=201)
def create_user(user: UserCreate):
# FastAPI memvalidasi request body secara otomatis
return {"name": user.name, "email": user.email}
Di FastAPI, jika client mengirim request body tanpa field name, atau age bukan integer, FastAPI otomatis mengembalikan response 422 Unprocessable Entity beserta pesan error yang detail — tanpa perlu validasi manual.
Validasi Data dan Serialisasi
Ini adalah salah satu perbedaan terbesar antara kedua framework.
Flask
Flask tidak memiliki validasi request bawaan. Kamu harus menanganinya sendiri atau menggunakan extensions:
from flask import request, jsonify
@app.route("/items", methods=["POST"])
def create_item():
data = request.get_json()
# Validasi manual
if "name" not in data:
return jsonify({"error": "name wajib diisi"}), 400
if not isinstance(data.get("price"), (int, float)):
return jsonify({"error": "price harus berupa angka"}), 400
return jsonify(data), 201
Library validasi yang populer untuk Flask antara lain Marshmallow, WTForms, dan Flask-Pydantic.
FastAPI
FastAPI menggunakan model Pydantic v2 untuk validasi dan serialisasi otomatis:
from fastapi import FastAPI
from pydantic import BaseModel, Field, EmailStr
app = FastAPI()
class Item(BaseModel):
name: str = Field(..., min_length=1, max_length=100)
price: float = Field(..., gt=0)
in_stock: bool = True
@app.post("/items", status_code=201)
def create_item(item: Item):
# item sudah tervalidasi dan type-safe
return item
Pydantic juga menangani serialisasi response — deklarasikan response_model dan FastAPI akan secara otomatis memfilter dan menyerialisasi output:
from pydantic import BaseModel
class UserPublic(BaseModel):
id: int
name: str
# password TIDAK disertakan di sini
@app.get("/users/{user_id}", response_model=UserPublic)
def get_user(user_id: int):
# Meskipun dict punya key "password", tidak akan dikembalikan
return {"id": user_id, "name": "Budi", "password": "rahasia"}
Async Support
Flask
Flask 2.0+ menambahkan dukungan untuk async route handlers, tapi arsitektur WSGI yang mendasarinya berarti konkurensi sejati masih membutuhkan beberapa worker process (misalnya via Gunicorn). Async di Flask memungkinkan tapi bukan native.
import asyncio
from flask import Flask
app = Flask(__name__)
@app.route("/lambat")
async def slow_endpoint():
await asyncio.sleep(1)
return {"status": "selesai"}
FastAPI
FastAPI dibangun di atas ASGI dan mendukung handler synchronous maupun asynchronous secara native. Kamu bisa mencampur def dan async def di aplikasi yang sama:
import asyncio
import httpx
from fastapi import FastAPI
app = FastAPI()
@app.get("/sync")
def sync_endpoint():
return {"type": "sync"}
@app.get("/async")
async def async_endpoint():
async with httpx.AsyncClient() as client:
response = await client.get("https://api.example.com/data")
return response.json()
Untuk workload yang banyak melakukan I/O — query database, panggilan API eksternal, baca file — async FastAPI bisa menangani jauh lebih banyak concurrent request di hardware yang sama dibandingkan Flask synchronous.
Dokumentasi Otomatis
Salah satu fitur unggulan FastAPI adalah dokumentasi API interaktif tanpa konfigurasi tambahan.
FastAPI
Setelah mendefinisikan routes dan Pydantic models, FastAPI otomatis menghasilkan:
- Swagger UI di
/docs - ReDoc di
/redoc - OpenAPI JSON schema di
/openapi.json
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI(
title="API Saya",
description="Contoh API yang dibangun dengan FastAPI",
version="1.0.0"
)
class Product(BaseModel):
name: str
price: float
@app.post("/products", summary="Buat produk baru", tags=["Products"])
def create_product(product: Product):
"""
Buat produk baru dengan:
- **name**: nama produk
- **price**: harga dalam USD
"""
return product
Docstring dan type hints langsung tercermin di docs interaktif.
Flask
Flask tidak punya fitur generate docs bawaan. Kamu perlu extension pihak ketiga seperti Flask-Swagger-UI atau APIFlask untuk mendapatkan sesuatu yang serupa.
Autentikasi dan Middleware
Flask
Flask menggunakan pola decorator untuk middleware dan menyediakan hooks @app.before_request / @app.after_request. Extension auth yang populer antara lain Flask-Login, Flask-JWT-Extended, dan Flask-HTTPAuth.
from functools import wraps
from flask import request, jsonify
API_KEY = "kunci-rahasia"
def require_api_key(f):
@wraps(f)
def decorated(*args, **kwargs):
key = request.headers.get("X-API-Key")
if key != API_KEY:
return jsonify({"error": "Tidak diizinkan"}), 401
return f(*args, **kwargs)
return decorated
@app.route("/protected")
@require_api_key
def protected():
return jsonify({"data": "rahasia"})
FastAPI
FastAPI menggunakan sistem dependency injection yang lebih powerful dan composable:
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
app = FastAPI()
security = HTTPBearer()
def verify_token(credentials: HTTPAuthorizationCredentials = Depends(security)):
if credentials.credentials != "token-valid":
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Token tidak valid"
)
return credentials.credentials
@app.get("/protected")
def protected(token: str = Depends(verify_token)):
return {"data": "rahasia", "token": token}
Dependency bisa di-nest, di-share antar routes, dan otomatis ditampilkan di docs interaktif.
Performa
FastAPI secara konsisten mengungguli Flask dalam benchmark, terutama karena:
- ASGI vs WSGI: ASGI menangani koneksi concurrent tanpa perlu spawn thread baru.
- Pydantic v2: Layer validasi ditulis dalam Rust, membuat serialisasi sangat cepat.
- Starlette: Layer routing dan middleware yang mendasarinya sangat dioptimalkan.
| Framework | Request/detik (perkiraan) | Latency (p99) |
|---|---|---|
| Flask (sync, Gunicorn) | ~3.000–5.000 | ~50–80ms |
| FastAPI (async, Uvicorn) | ~20.000–40.000 | ~5–15ms |
Catatan: Angka-angka ini sangat bervariasi tergantung hardware, I/O database, dan jenis workload. Lakukan profiling pada aplikasi spesifik Kamu sebelum membuat keputusan berdasarkan benchmark saja.
Untuk workload yang berat di CPU, keunggulan ini menyempit karena Python’s GIL tetap berlaku untuk kode synchronous di kedua framework.
Ekosistem dan Extensions
Ekosistem Flask
Flask sudah ada sejak 2010 dan memiliki ekosistem extension yang kaya:
- Flask-SQLAlchemy — integrasi ORM
- Flask-Migrate — migrasi database
- Flask-Login — manajemen sesi user
- Flask-Caching — layer caching
- Flask-Mail — pengiriman email
- Celery — task queue (bekerja dengan Flask)
- Blueprints — struktur aplikasi modular
Ekosistem FastAPI
FastAPI lebih baru tapi sudah membangun ekosistem yang kuat dengan cepat:
- SQLAlchemy / SQLModel — ORM (SQLModel dibuat oleh author FastAPI yang sama)
- Alembic — migrasi database
- python-jose / python-multipart — JWT dan file upload
- Celery / ARQ — task queue
- FastAPI Users — sistem autentikasi user siap pakai
- Starlette middleware — CORS, GZip, sessions
Kapan Pilih Flask
Flask adalah pilihan yang lebih baik ketika:
- Kamu membangun web application tradisional dengan server-side rendering menggunakan template Jinja2.
- Tim Kamu sudah familiar dengan Flask dan project tidak membutuhkan high concurrency.
- Kamu butuh extension Flask tertentu yang belum ada padanannya di FastAPI.
- Project kecil atau prototype di mana familiaritas developer lebih penting dari performa mentah.
- Kamu mengintegrasikan dengan legacy WSGI middleware yang tidak kompatibel dengan ASGI.
- Kamu ingin fleksibilitas maksimal — core Flask yang minimal berarti struktur yang lebih bebas.
Kapan Pilih FastAPI
FastAPI adalah pilihan yang lebih baik ketika:
- Kamu membangun API murni atau microservice — FastAPI dirancang untuk use case ini sejak awal.
- Performa dan konkurensi penting — dukungan async memungkinkan throughput lebih tinggi di hardware yang sama.
- Kamu ingin validasi dan docs otomatis — ini saja bisa menghemat berjam-jam boilerplate per project.
- Tim Kamu menggunakan type hints Python — FastAPI terasa natural untuk tim yang sudah mengetik kode Python mereka.
- Kamu membangun layanan yang data-intensive — Pydantic terintegrasi dengan indah dengan alur kerja data science.
- Kamu ingin framework yang modern dan aktif dikembangkan — FastAPI mengikuti fitur terbaru Python dengan dekat.
Ringkasan Perbandingan
| Fitur | Flask | FastAPI |
|---|---|---|
| Tahun rilis | 2010 | 2018 |
| Arsitektur | WSGI | ASGI |
| Async support | Sebagian (2.0+) | Native |
| Validasi data | Manual / extensions | Built-in (Pydantic) |
| Dokumentasi API | Perlu extension | Otomatis (Swagger + ReDoc) |
| Type hints | Opsional | Fitur utama |
| Learning curve | Sangat rendah | Rendah–Sedang |
| Performa | Baik | Sangat baik |
| Kematangan ekosistem | Sangat matang | Berkembang pesat |
| Terbaik untuk | Web app, fleksibilitas | API, microservices |
FAQ
Q: Bisakah FastAPI digunakan untuk web app full-stack dengan template?
A: Bisa — FastAPI mendukung template Jinja2 via Jinja2Templates. Namun Flask tetap lebih ergonomis untuk aplikasi yang banyak menggunakan template.
Q: Apakah Flask sudah “mati”?
A: Sama sekali tidak. Flask masih aktif dipelihara, banyak digunakan di production, dan terus mendapat rilis reguler. Flask tetap pilihan solid untuk banyak use case.
Q: Bisakah migrasi dari Flask ke FastAPI dilakukan secara bertahap?
A: Bisa. Kamu bisa menjalankan keduanya di balik reverse proxy (seperti Nginx) dan migrasi endpoint secara incremental. Tidak perlu rewrite besar-besaran sekaligus.
Q: Mana yang lebih baik untuk serving model machine learning?
A: FastAPI umumnya lebih disukai untuk serving model ML karena async support, validasi otomatis, dan performanya — meskipun Flask dengan Gunicorn juga sangat layak untuk use case dengan traffic lebih rendah.
Q: Apakah keduanya mendukung WebSocket?
A: FastAPI mendukung WebSocket secara native. Flask membutuhkan extension seperti Flask-SocketIO yang menggunakan protokol berbeda (Socket.IO).
Resources
- Dokumentasi Flask
- Dokumentasi FastAPI
- Dokumentasi Pydantic
- Dokumentasi Starlette
- Dokumentasi Uvicorn
Artikel Terkait:
- Bagaimana Cara Manage Logs di Aplikasi Flask?
- API Development Best Practices — Membangun API yang Secure & Scalable
- Database Design Fundamentals — Membangun Database yang Efisien
- Testing Strategies for Web Apps — Pastikan Kualitas Kode
Punya pengalaman dengan kedua framework ini? Bagikan pendapat Kamu di kolom komentar! 💬