Flask Configuration & Application Factory

βš™οΈ Basic config

app.config["SECRET_KEY"] = "value"
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///app.db"
app.config["DEBUG"] = True

πŸ“„ Config classes

# config.py
import os
 
class Config:
    SECRET_KEY = os.environ.get("SECRET_KEY", "dev-key-change-me")
    SQLALCHEMY_TRACK_MODIFICATIONS = False
 
class DevelopmentConfig(Config):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = "sqlite:///dev.db"
 
class ProductionConfig(Config):
    DEBUG = False
    SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL")
 
class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = "sqlite:///:memory:"
app.config.from_object(DevelopmentConfig)

.env file

pip install python-dotenv
from dotenv import load_dotenv
load_dotenv()
# .env
SECRET_KEY=genuinely-long-random-string
DATABASE_URL=postgresql://user:pass@localhost/mydb

Never commit .env. Add to .gitignore. Commit a .env.example instead.

🏭 Application factory pattern

# app/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
 
db = SQLAlchemy()   # created without app
 
def create_app(config_class=DevelopmentConfig):
    app = Flask(__name__)
    app.config.from_object(config_class)
 
    db.init_app(app)   # initialized separately
 
    from app.blog.routes import blog_bp
    app.register_blueprint(blog_bp, url_prefix="/blog")
 
    return app
# run.py
from app import create_app
app = create_app()
 
if __name__ == "__main__":
    app.run(debug=True)

Why bother: lets you spin up a fresh, differently-configured app per test/environment. Essential for testing (see Flask Testing & Deployment).

πŸ—‚οΈ Full factory-based layout

myproject/
β”œβ”€β”€ run.py
β”œβ”€β”€ config.py
β”œβ”€β”€ requirements.txt
β”œβ”€β”€ .env
β”œβ”€β”€ .gitignore
└── app/
    β”œβ”€β”€ __init__.py
    β”œβ”€β”€ models.py
    β”œβ”€β”€ blog/
    β”‚   β”œβ”€β”€ __init__.py
    β”‚   β”œβ”€β”€ routes.py
    β”‚   └── templates/blog/
    β”œβ”€β”€ auth/
    β”œβ”€β”€ templates/base.html
    └── static/

🌍 Selecting config by environment

import os
env = os.environ.get("FLASK_ENV", "development")
config_class = ProductionConfig if env == "production" else DevelopmentConfig
app = create_app(config_class)

🧾 Common config keys

KeyPurpose
SECRET_KEYsigns sessions/CSRF
SQLALCHEMY_DATABASE_URIDB connection string
DEBUGdebug mode
TESTINGtesting mode
SESSION_COOKIE_SECUREHTTPS-only session cookie
PERMANENT_SESSION_LIFETIMEsession duration
MAX_CONTENT_LENGTHmax request body size

πŸ”— Next

Flask Extensions & Middleware Β· Flask Testing & Deployment