Skip to content

Handling Configuration (config.py)

Configuration is where many Flask apps go wrong.

Good config:

  • separates dev vs prod
  • uses environment variables for secrets
  • keeps defaults sensible

A common pattern: config classes

config.pyconfig.py:

import os
 
 
class BaseConfig:
    SECRET_KEY = os.environ.get("SECRET_KEY", "dev-key")
    SQLALCHEMY_TRACK_MODIFICATIONS = False
 
 
class DevelopmentConfig(BaseConfig):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL", "sqlite:///app.db")
 
 
class TestingConfig(BaseConfig):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = "sqlite:///:memory:"
 
 
class ProductionConfig(BaseConfig):
    DEBUG = False
    SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL")
import os
 
 
class BaseConfig:
    SECRET_KEY = os.environ.get("SECRET_KEY", "dev-key")
    SQLALCHEMY_TRACK_MODIFICATIONS = False
 
 
class DevelopmentConfig(BaseConfig):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL", "sqlite:///app.db")
 
 
class TestingConfig(BaseConfig):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = "sqlite:///:memory:"
 
 
class ProductionConfig(BaseConfig):
    DEBUG = False
    SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL")

Loading config into app

app.config.from_object("config.DevelopmentConfig")
app.config.from_object("config.DevelopmentConfig")

Or:

app.config.from_object(config_object)
app.config.from_object(config_object)

Secrets

Never commit secrets (SECRET_KEY, DB passwords) to git.

Use:

  • .env.env files locally (with python-dotenv)
  • CI/hosting environment variables in production

If this helped you, consider buying me a coffee ☕

Buy me a coffee

Was this page helpful?

Let us know how we did