Belajar Flask - Configuration & Environments
Episode 8 of 27

Belajar Flask - Configuration & Environments

Menata konfigurasi aplikasi Flask dengan config classes, environment variables, instance folder untuk data runtime, dan penyimpanan secrets, serta menerapkan prinsip 12-factor untuk memisahkan lingkungan dev, testing, dan produksi.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Sejauh ini semua kode kita berjalan dengan default Flask: secret_key kosong, database belum ada, dan debug mode ditentukan manual. Saat aplikasi mulai serius, kalian butuh cara mengelola konfigurasi — nilai yang berbeda antara development, testing, dan produksi — tanpa mencampurnya dengan logika. Inilah topik episode 8: configuration & environments.

Kita akan menerapkan prinsip 12-factor app: konfigurasi dari environment variables, pemisahan dev/prod yang tegas, dan penanganan secrets yang aman.

App.config: Kamus Konfigurasi Flask

Flask menyimpan semua pengaturan di objek app.config — kamus yang bisa diakses dari mana saja:

PythonMembaca dan menulis konfigurasi
from flask import Flask, current_app
 
app = Flask(__name__)
app.config["SECRET_KEY"] = "dev-only-key"
app.config["DEBUG"] = True
 
# di dalam view atau helper:
@app.get("/debug")
def debug_info() -> str:
    return f"Debug mode: {current_app.config['DEBUG']}"

app.config juga menyediakan akses atribut (app.config.SECRET_KEY) dan pengaturan bawaan Flask seperti DEBUG, TESTING, SECRET_KEY, dan MAX_CONTENT_LENGTH. Nilai yang masuk dari environment secara otomatis tersedia — berikutnya kita merapikannya dengan config classes.

Config Classes: Pola Standar

Pola paling umum adalah config classes — satu class per lingkungan, semuanya mewarisi class dasar:

Pythonconfig.py - config classes
import os
 
 
class BaseConfig:
    SECRET_KEY = os.environ.get("SECRET_KEY", "dev-change-me")
    SQLALCHEMY_TRACK_MODIFICATIONS = False
 
 
class DevelopmentConfig(BaseConfig):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = "sqlite:///dev.db"
 
 
class TestingConfig(BaseConfig):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = "sqlite:///:memory:"
 
 
class ProductionConfig(BaseConfig):
    DEBUG = False
    SECRET_KEY = os.environ["SECRET_KEY"]  # wajib ada di produksi
    SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL")

Pola ini memberi satu tempat untuk semua perbedaan lingkungan, dan nilai sensitif (SECRET_KEY, DATABASE_URL) diambil dari environment — bukan diketik di source code. Perhatikan TestingConfig memakai database in-memory agar test cepat dan terisolasi.

Memuat Konfigurasi

Muat class yang sesuai dengan environment yang aktif:

PythonMemuat konfigurasi sesuai environment
import os
from flask import Flask
from config import DevelopmentConfig, ProductionConfig, TestingConfig
 
 
def create_app() -> Flask:
    app = Flask(__name__)
    env = os.environ.get("FLASK_ENV", "development")
 
    if env == "testing":
        app.config.from_object(TestingConfig)
    elif env == "production":
        app.config.from_object(ProductionConfig)
    else:
        app.config.from_object(DevelopmentConfig)
 
    return app

Bersamaan dengan application factory (episode 9), pola ini membuat aplikasi deterministik: environment yang sama → konfigurasi yang sama. Nilai FLASK_ENV juga memberi tahu perintah flask apakah debug mode aktif, sehingga flask run otomatis berperilaku sesuai lingkungan.

Environment Variables dan 12-Factor

Prinsip inti 12-factor: konfigurasi masuk lewat environment variables, bukan hardcode di kode. Praktik yang benar:

Set environment variables
export FLASK_ENV=development
export SECRET_KEY=generated-random-string
export DATABASE_URL=sqlite:///dev.db

Dari Python, baca dengan os.environ.get() — dengan default hanya untuk development. Untuk memudahkan development lokal, gunakan file .env dan library seperti python-dotenv (Flask CLI otomatis membacanya jika terpasang):

.env - contoh isi
FLASK_ENV=development
SECRET_KEY=dev-only-secret

Important

Jangan pernah commit file .env, config.local.py, atau file berisi secret ke git. Tambahkan ke .gitignore sejak awal, dan sediakan .env.example yang berisi placeholder agar anggota tim tahu variabel apa yang dibutuhkan. Secret di produksi sebaiknya disuntikkan lewat secret manager/CI.

Instance Folder: Data Runtime

Kadang aplikasi butuh menyimpan file runtime — database SQLite, file upload, atau cache — di lokasi yang bukan bagian dari source code. Flask menyediakan instance folder: folder khusus yang dibuat saat aplikasi diinisialisasi.

PythonMenggunakan instance folder
app = Flask(__name__, instance_relative_config=True)
 
# SQLite database di instance folder:
app.config.from_mapping(
    SQLALCHEMY_DATABASE_URI=f"sqlite:///{app.instance_path}/app.db"
)
 
os.makedirs(app.instance_path, exist_ok=True)

instance_relative_config=True membuat konfigurasi relatif terhadap instance folder — pas untuk file config lokal yang spesifik mesin (seperti config.cfg yang tidak di-commit). File di instance folder tidak ikut versioning dan tidak akan tertimpa saat deploy.

Menangani Secrets

Secret adalah nilai yang wajib dijaga — SECRET_KEY, credential database, API key. Aturannya:

  • Development: default aman di source code (dev-only-key), boleh via .env.
  • Testing: nilai dummy yang stabil.
  • Produksi: tidak boleh ada di source code; wajib dari environment, secret manager (AWS Secrets Manager, Vault), atau CI variables.
PythonMemaksa secret ada di produksi
class ProductionConfig(BaseConfig):
    SECRET_KEY = os.environ["SECRET_KEY"]  # KeyError jika tidak ada
    DATABASE_URL = os.environ["DATABASE_URL"]

Dengan pola os.environ["..."] (tanpa default) di config produksi, aplikasi gagal cepat jika secret belum disuntikkan — lebih baik error saat start daripada aplikasi berjalan dengan secret default yang bisa ditebak.

Warning

SECRET_KEY default Flask yang "secret" sebenarnya sering dipakai aplikasi yang lupa mengubahnya — nilai default yang dikenal publik. Jika kalian memakai session cookie atau token (episode 13), secret key yang lemah berarti penyerang bisa memalsukan session. Selalu generate key acak panjang: python -c "import secrets; print(secrets.token_hex(32))".

Common Pitfalls Konfigurasi

  • Config tercampur di banyak file: pusatkan di config.py dengan class per lingkungan.
  • Secret di source code: commit .env atau hardcode SECRET_KEY = pintu masuk penyerang.
  • Tanpa pemisahan dev/prod: DEBUG=True di produksi = eksekusi kode remote via debugger (episode 3).
  • Config global di module level: tidak bisa diubah per-test. Gunakan factory + config class (episode 9).
  • Mengandalkan default Flask: nilai default DEBUG=False dan SECRET_KEY=None bisa disetel, tetapi dokumentasi eksplisit jauh lebih baik.

Penutup

Pada episode 8 ini, kalian telah menata konfigurasi ala 12-factor.

Inti yang harus dibawa pulang:

  • app.config adalah pusat konfigurasi Flask; akses lewat current_app.config.
  • Config classes (Base/Development/Testing/Production) memisahkan lingkungan dengan jelas.
  • Konfigurasi masuk via environment variables; .env hanya untuk development.
  • Instance folder untuk data runtime; jangan campur dengan source code.
  • Secrets wajib dari environment di produksi — gunakan os.environ["KEY"] tanpa default.

Di episode 9 selanjutnya, kita merakit semuanya: blueprints & application factory — modular apps dengan url prefix dan blueprint-specific templates/static, create_app(), init extension, dan struktur proyek scalable untuk aplikasi sungguhan. Sampai jumpa di episode 9!

Belajar Flask - Configuration & Environments | Belajar Flask