Override arbitrary Django settings via environment variables.
- Free software: BSD license
tests | |
---|---|
package |
This package lets you override any Django setting using environment variables, just by adding a couple of lines to the bottom of settings.py.
This is handy if:
- You have a project that is not currently configurable via environment variables, and you want to quickly adapt it to run in an environment like Heroku.
- You want to be able to quickly override settings on deployed code for debugging.
This is not a good idea as the primary way of configuring a complex project in production. In general you'll be happier keeping all settings in source control, and explicitly recording which settings need to be provided by environment variables using django-environ.
pip install django-env-overrides
django-env-overrides lets you quickly adjust an existing Django app to load arbitrary settings from environment variables.
It uses django-environ to parse settings from the environment, but allows override of arbitrary settings without specific changes to settings.py
.
Add these lines to the end of your settings.py
file:
import django_env_overrides django_env_overrides.apply_to(globals())
Any environment variable prefixed with DJANGO__
will now be imported to your settings.
settings.py:
DEBUG = True MEDIA_URL = '/media/' DATABASES = { 'default': { 'ENGINE': 'sqlite3', } } TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'OPTIONS': { 'context_processors': [ 'django.contrib.auth.context_processors.auth', ] } } ] import django_env_overrides django_env_overrides.apply_to(globals())
Environment:
DJANGO__SECRET_KEY=secret DJANGO__MEDIA_URL=/new_url/ DJANGO__bool__DEBUG=False POSTGRES=postgres://uf07k1:[email protected]:5431/d8r82722 DJANGO__db__DATABASES__default=$POSTGRES DJANGO__TEMPLATES__0__OPTIONS__context_processors__1='my.context.processor'
Result:
DEBUG = False MEDIA_URL = '/new_url/' SECRET_KEY = 'secret' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'd8r82722', 'HOST': 'ec2-107-21-253-135.compute-1.amazonaws.com', 'USER': 'uf07k1', 'PASSWORD': 'wegauwhg', 'PORT': 5431, } } TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'OPTIONS': { 'context_processors': [ 'django.contrib.auth.context_processors.auth', 'my.context.processor', ] } } ]
The format for environment variable names is:
<prefix>__<typecast>__<path>__<to>__<target>__<setting>
<prefix>
defaults to DJANGO
. If you want to use another prefix, use django_env_overrides.apply_to(globals(), prefix="MYPREFIX")
.
<typecast>
(optional) is any type known to the django-environ package.
Currently the supported types are str, bool, int, float, json, list, tuple, dict, url, path, db_url, cache_url, search_url, and email_url.
See the django-environ package for usage. If <typecast>
is omitted, values are set as str
.
<path>__<to>__<target>__<setting>
specifies the setting or subsetting the value should be assigned to. Path elements
are treated as array indexes if they are integers, and otherwise as dictionary keys.
See CONTRIBUTING.rst