If you look at modern code deployment practices, like in the 12 factor app, environment variables are very important for keeping secret information, or specific information set for a server. All while not having long settings in a settings file —files, or every single server and host. It helps keep things simple and clean in your code along with the following quoted from the 12factorapp site:
- Resource handles to the database, Memcached, and other backing services
- Credentials to external services such as Amazon S3 or Twitter
- Per-deploy values such as the canonical hostname for the deploy
What Are Environment Variables?
Environment variables are a key:value pairs that can affect how a program runs. They need to be set at some point before a process is run so the process can read them in and act accordingly. A lot of times in production environments your database name and passwords are set as environment variables so that information does not end up in a code repository somewhere. Unfortunately it does even publicly sometimes.
By relying on an environment variable your code doesn’t care what your settings
are because you can set them some other point. Actually working with environment
variables is really simple. All you need to start is importing native os module:
import os name = os.environ.get('USER')
OK but where to put and find these variables in your os? There are a lot of ways but below 2 I think have best implementations:
1 - Virtual Environment
One of the best ways is to get them from virtual environment. When you activate
your virtual env
source .venv/bin/activate, “activate” script runs. You can
add below script to the end of this activate file:
export $(grep -v '^#' ./.env | xargs)
./ is your project “root directory”. So if you have more than one
files you can add them too as below:
export $(grep -v '^#' ./.env | xargs) export $(grep -v '^#' ./.envs/.env.dev | xargs)
I usually use this method but this requires an
Unix-like OS (MacOS & Linux
2 - Django-Environ Module Library
In your project
import environ env = environ.Env() # reading .env file env.read_env(env.str('./', '.env')) # https://docs.djangoproject.com/en/dev/ref/settings/#secret-key SECRET_KEY = env('DJANGO_SECRET_KEY')
In addtion to all of these above you can export your
env vars via
.bash_profile or even
.profile but this would be a bad practice: using
project wide restrictions over system wide.
If you are enjoying my content, maybe you would enjoy buying me a coffee as well.
Just a food for thought.