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.envfiles locally (with python-dotenv)- CI/hosting environment variables in production
If this helped you, consider buying me a coffee ☕
Buy me a coffeeWas this page helpful?
Let us know how we did
