Django Environment Variables
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
.
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)
Where ./
is your project “root directory”. So if you have more than one env
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
etc).
2 - Django-Environ Module Library
django-environ module allows you to use Twelve-factor methodology to configure your Django application with environment variables.
In your project settings.py
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 .bashrc
or
.bash_profile
or even .profile
but this would be a bad practice: using
project wide restrictions over system wide.