Skip to content

Multiple environments

It is convenient to load environment variables and use these to configure the app. This way, the app will be configured differently in different environments.

Setting manually

We can set environment variables manually in the terminal. They will be persisted only for the terminal session, so when you close the terminal they will be wiped.

bash
export X=123

echo $X
# 123
powershell
$env:X = 1

echo $env:X
# 123

This is useful, but if there are many variables it can be tedious.

Using env files

We can create separate .env files and choose which one to load based on the context.

bash
SECRET_KEY=21e29e988dec32f6eb6bd20bde3a14c1
DB_URL=sqlite:////home/user/project/dev.sqlite
bash
SECRET_KEY=4b02f45f952b5f050606efea58c35c2e
DB_URL=sqlite:///:memory:

WARNING

Add .env and .env.* to your .gitignore to prevent the environment files from being uploaded to version control.

Loading variables

We access environments variables using os.getenv("VAR_NAME").

We can import the environment variables into a config.py like this:

py
# config.py
import os
from dotenv import load_dotenv

MODE = os.getenv("MODE", "development")
load_dotenv(f".env.{MODE}")

PORT = int(os.getenv("PORT", 5000))
DEBUG = MODE in ["development", "testing"]
TESTING = MODE == "testing"
SECRET_KEY = os.getenv("SECRET_KEY")
SQLALCHEMY_DATABASE_URI = os.getenv("DB_URL")

These variables will change dynamically depending on what is available in the environment.

Switching modes

We can switch to testing before we test:

bash
export MODE="testing"
pytest
powershell
$env:MODE = "testing"
pytest

And switch back when developing:

bash
export MODE="development"
python -m src.run
powershell
$env:MODE = "development"
python -m src.run