Bird
Raised Fist0
Flaskframework~5 mins

Environment-based configuration in Flask

Choose your learning style10 modes available
Introduction

Environment-based configuration helps your Flask app use different settings for development, testing, and production without changing code.

You want to use a debug mode only when developing.
You need different database connections for testing and production.
You want to keep secret keys safe and not hard-code them.
You want to change app behavior based on where it runs (local or server).
Syntax
Flask
from flask import Flask
import os

app = Flask(__name__)

# Load config from environment variable
app.config.from_envvar('MYAPP_SETTINGS')
Use app.config.from_envvar() to load config from a file path stored in an environment variable.
You can also set config values directly from os.environ.
Examples
Define different config classes for each environment and load the right one.
Flask
import os

class Config:
    DEBUG = False
    SECRET_KEY = 'defaultsecret'

class DevelopmentConfig(Config):
    DEBUG = True
    SECRET_KEY = 'devsecret'

class ProductionConfig(Config):
    SECRET_KEY = os.environ.get('SECRET_KEY')

app.config.from_object(DevelopmentConfig)
Set a config value directly from an environment variable with a fallback.
Flask
import os

app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'fallbacksecret')
Load configuration from a Python file.
Flask
app.config.from_pyfile('config.py')
Sample Program

This Flask app loads different settings based on the FLASK_ENV environment variable. It shows debug mode and secret key on the homepage.

Flask
from flask import Flask
import os

class Config:
    DEBUG = False
    SECRET_KEY = 'defaultsecret'

class DevelopmentConfig(Config):
    DEBUG = True
    SECRET_KEY = 'devsecret'

class ProductionConfig(Config):
    SECRET_KEY = os.environ.get('SECRET_KEY', 'prodsecret')

app = Flask(__name__)

# Choose config based on environment variable
env = os.environ.get('FLASK_ENV', 'development')
if env == 'production':
    app.config.from_object(ProductionConfig)
else:
    app.config.from_object(DevelopmentConfig)

@app.route('/')
def index():
    debug_mode = app.config['DEBUG']
    secret = app.config['SECRET_KEY']
    return f"Debug: {debug_mode}, Secret: {secret}"

if __name__ == '__main__':
    app.run()
OutputSuccess
Important Notes

Always keep secret keys and sensitive info out of your code and use environment variables.

Use FLASK_ENV or your own variable to switch configs easily.

Remember to restart your app after changing environment variables.

Summary

Use environment-based config to keep your app flexible and secure.

Define separate config classes or files for each environment.

Load config using environment variables and Flask methods like from_object or from_envvar.

Practice

(1/5)
1. What is the main reason to use environment-based configuration in a Flask app?
easy
A. To avoid using environment variables completely
B. To write all configuration directly in the main app file
C. To separate settings for development, testing, and production environments
D. To hardcode sensitive data like passwords in the code

Solution

  1. Step 1: Understand environment-based configuration purpose

    It helps keep different settings for development, testing, and production separate and secure.
  2. Step 2: Identify best practice for config management

    Separating configs avoids hardcoding sensitive data and makes the app flexible across environments.
  3. Final Answer:

    To separate settings for development, testing, and production environments -> Option C
  4. Quick Check:

    Environment-based config = Separate settings [OK]
Hint: Think about keeping dev and prod settings separate [OK]
Common Mistakes:
  • Hardcoding all config in one file
  • Ignoring environment differences
  • Storing secrets in code
  • Not using environment variables
2. Which of the following is the correct way to load configuration from a Python class in Flask?
easy
A. app.config.from_object('config.DevelopmentConfig')
B. app.config.from_file('config.py')
C. app.load_config('config.py')
D. app.config.load('DevelopmentConfig')

Solution

  1. Step 1: Recall Flask config loading methods

    Flask uses from_object to load config from a Python class.
  2. Step 2: Match correct syntax

    app.config.from_object('config.DevelopmentConfig') correctly loads the class named DevelopmentConfig from config module.
  3. Final Answer:

    app.config.from_object('config.DevelopmentConfig') -> Option A
  4. Quick Check:

    Use from_object to load class config [OK]
Hint: Use from_object with full class path string [OK]
Common Mistakes:
  • Using non-existent methods like from_file or load_config
  • Passing filename instead of class path
  • Missing quotes around class path
  • Confusing from_object with from_envvar
3. Given this Flask config setup:
class Config:
    DEBUG = False

class DevelopmentConfig(Config):
    DEBUG = True

app = Flask(__name__)
app.config.from_object(DevelopmentConfig)
print(app.config['DEBUG'])

What will be printed?
medium
A. False
B. KeyError
C. None
D. True

Solution

  1. Step 1: Understand class inheritance

    DevelopmentConfig inherits from Config and overrides DEBUG to True.
  2. Step 2: Check which config is loaded

    app.config.from_object loads DevelopmentConfig, so DEBUG is True.
  3. Final Answer:

    True -> Option D
  4. Quick Check:

    Subclass overrides DEBUG = True [OK]
Hint: Subclass config overrides parent values [OK]
Common Mistakes:
  • Assuming base class value is used
  • Confusing attribute names
  • Expecting KeyError for existing keys
  • Ignoring inheritance
4. What is wrong with this Flask config loading code?
app = Flask(__name__)
app.config.from_envvar('MY_CONFIG')

Assuming the environment variable MY_CONFIG is not set.
medium
A. It will silently ignore missing MY_CONFIG and use default config
B. It will raise a RuntimeError because MY_CONFIG is missing
C. It will load config from a file named 'MY_CONFIG'
D. It will load config from environment variables automatically

Solution

  1. Step 1: Understand from_envvar behavior

    from_envvar expects an environment variable with a filepath; if missing, it raises RuntimeError.
  2. Step 2: Check what happens if MY_CONFIG is not set

    Since MY_CONFIG is missing, Flask raises RuntimeError to alert missing config file.
  3. Final Answer:

    It will raise a RuntimeError because MY_CONFIG is missing -> Option B
  4. Quick Check:

    Missing env var causes RuntimeError [OK]
Hint: from_envvar requires env var set or it errors [OK]
Common Mistakes:
  • Assuming it ignores missing env var
  • Thinking it loads from env vars automatically
  • Confusing from_envvar with from_object
  • Expecting silent fallback to defaults
5. You want your Flask app to load different configs based on the environment variable FLASK_ENV. Which code snippet correctly implements this?
hard
A. if os.getenv('FLASK_ENV') == 'production': app.config.from_object('config.ProductionConfig') else: app.config.from_object('config.DevelopmentConfig')
B. app.config.from_object('config.' + FLASK_ENV + 'Config')
C. app.config.from_envvar('FLASK_ENV')
D. app.config.from_object('config.DefaultConfig')

Solution

  1. Step 1: Check how to read environment variable

    Use os.getenv('FLASK_ENV') to get the current environment string.
  2. Step 2: Use conditional logic to load correct config

    If environment is 'production', load ProductionConfig; otherwise load DevelopmentConfig.
  3. Final Answer:

    if os.getenv('FLASK_ENV') == 'production': app.config.from_object('config.ProductionConfig') else: app.config.from_object('config.DevelopmentConfig') -> Option A
  4. Quick Check:

    Use os.getenv + if-else to select config [OK]
Hint: Use os.getenv and if-else to pick config class [OK]
Common Mistakes:
  • Trying to concatenate string without quotes
  • Using from_envvar with FLASK_ENV directly
  • Not handling default environment
  • Loading only one config regardless of env
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard