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:wegauwhg@ec2-107-21-253-135.compute-1.amazonaws.com: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