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-dotenvfrom 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.exampleinstead.
π 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
| Key | Purpose |
|---|---|
SECRET_KEY | signs sessions/CSRF |
SQLALCHEMY_DATABASE_URI | DB connection string |
DEBUG | debug mode |
TESTING | testing mode |
SESSION_COOKIE_SECURE | HTTPS-only session cookie |
PERMANENT_SESSION_LIFETIME | session duration |
MAX_CONTENT_LENGTH | max request body size |