Skip to main content

Django-environ

Latest version released on PyPi Build status of the master branch on Mac/Linux Build status of the master branch on Windows Test coverage contributors Package license Say Thanks!

django-environ allows you to use Twelve-factor methodology to configure your Django application with environment variables.

Photo by Singkham from Pexels

import environ
env = environ.Env(
    # set casting, default value
    DEBUG=(bool, False)
)
# reading .env file
environ.Env.read_env()

# False if not in os.environ
DEBUG = env('DEBUG')

# Raises django's ImproperlyConfigured exception if SECRET_KEY not in os.environ
SECRET_KEY = env('SECRET_KEY')

# Parse database connection url strings like psql://user:pass@127.0.0.1:8458/db
DATABASES = {
    # read os.environ['DATABASE_URL'] and raises ImproperlyConfigured exception if not found
    'default': env.db(),
    # read os.environ['SQLITE_URL']
    'extra': env.db('SQLITE_URL', default='sqlite:////tmp/my-tmp-sqlite.db')
}

CACHES = {
    # read os.environ['CACHE_URL'] and raises ImproperlyConfigured exception if not found
    'default': env.cache(),
    # read os.environ['REDIS_URL']
    'redis': env.cache('REDIS_URL')
}

See the similar code, sans django-environ.

     _ _                                              _
    | (_)                                            (_)
  __| |_  __ _ _ __   __ _  ___ ______ ___ _ ____   ___ _ __ ___  _ __
 / _` | |/ _` | '_ \ / _` |/ _ \______/ _ \ '_ \ \ / / | '__/ _ \| '_ \
| (_| | | (_| | | | | (_| | (_) |    |  __/ | | \ V /| | | | (_) | | | |
 \__,_| |\__,_|_| |_|\__, |\___/      \___|_| |_|\_/ |_|_|  \___/|_| |_|
     _/ |             __/ |
    |__/             |___/

The idea of this package is to unify a lot of packages that make the same stuff: Take a string from os.environ, parse and cast it to some of useful python typed variables. To do that and to use the 12factor approach, some connection strings are expressed as url, so this package can parse it and return a urllib.parse.ParseResult. These strings from os.environ are loaded from a .env file and filled in os.environ with setdefault method, to avoid to overwrite the real environ. A similar approach is used in Two Scoops of Django book and explained in 12factor-django article.

Using django-environ you can stop to make a lot of unversioned settings_*.py to configure your app. See cookiecutter-django for a concrete example on using with a django project.

Feature Support

  • Fast and easy multi environment for deploy

  • Fill os.environ with .env file variables

  • Variables casting (see supported_types below)

  • Url variables exploded to django specific package settings

Django-environ officially supports Django 1.8 ~ 2.0.

Installation

$ pip install django-environ

NOTE: No need to add it to INSTALLED_APPS.

Then create a .env file:

DEBUG=on
SECRET_KEY=your-secret-key
DATABASE_URL=psql://urser:un-githubbedpassword@127.0.0.1:8458/database
SQLITE_URL=sqlite:///my-local-sqlite.db
CACHE_URL=memcache://127.0.0.1:11211,127.0.0.1:11212,127.0.0.1:11213
REDIS_URL=rediscache://127.0.0.1:6379/1?client_class=django_redis.client.DefaultClient&password=ungithubbed-secret

And use it with settings.py above. Don’t forget to add .env in your .gitignore (tip: add .env.example with a template of your variables).

Documentation

Documentation is available at RTFD.

Supported types

  • str

  • bool

  • int

  • float

  • json

  • list (FOO=a,b,c)

  • tuple (FOO=(a,b,c))

  • dict (BAR=key=val,foo=bar) #environ.Env(BAR=(dict, {}))

  • dict (BAR=key=val;foo=1.1;baz=True) #environ.Env(BAR=(dict(value=unicode, cast=dict(foo=float,baz=bool)), {}))

  • url

  • path (environ.Path)

  • db_url
    • PostgreSQL: postgres://, pgsql://, psql:// or postgresql://

    • PostGIS: postgis://

    • MySQL: mysql:// or mysql2://

    • MySQL for GeoDjango: mysqlgis://

    • SQLITE: sqlite://

    • SQLITE with SPATIALITE for GeoDjango: spatialite://

    • Oracle: oracle://

    • MSSQL: mssql://

    • PyODBC: pyodbc://

    • Redshift: redshift://

    • LDAP: ldap://

  • cache_url
    • Database: dbcache://

    • Dummy: dummycache://

    • File: filecache://

    • Memory: locmemcache://

    • Memcached: memcache://

    • Python memory: pymemcache://

    • Redis: rediscache://

  • search_url
    • ElasticSearch: elasticsearch://

    • Solr: solr://

    • Whoosh: whoosh://

    • Xapian: xapian://

    • Simple cache: simple://

  • email_url
    • SMTP: smtp://

    • SMTP+SSL: smtp+ssl://

    • SMTP+TLS: smtp+tls://

    • Console mail: consolemail://

    • File mail: filemail://

    • LocMem mail: memorymail://

    • Dummy mail: dummymail://

Tips

Using unsafe characters in URLs

In order to use unsafe characters you have to encode with urllib.parse.encode before you set into .env file.

DATABASE_URL=mysql://user:%23password@127.0.0.1:3306/dbname

See https://perishablepress.com/stop-using-unsafe-characters-in-urls/ for reference.

Multiple redis cache locations

For redis cache, multiple master/slave or shard locations can be configured as follows:

CACHE_URL='rediscache://master:6379,slave1:6379,slave2:6379/1'

Email settings

In order to set email configuration for django you can use this code:

EMAIL_CONFIG = env.email_url(
    'EMAIL_URL', default='smtp://user@:password@localhost:25')

vars().update(EMAIL_CONFIG)

SQLite urls

SQLite connects to file based databases. The same URL format is used, omitting the hostname, and using the “file” portion as the filename of the database. This has the effect of four slashes being present for an absolute

file path: sqlite:////full/path/to/your/database/file.sqlite.

Nested lists

Some settings such as Django’s ADMINS make use of nested lists. You can use something like this to handle similar cases.

# DJANGO_ADMINS=John:john@admin.com,Jane:jane@admin.com
ADMINS = [x.split(':') for x in env.list('DJANGO_ADMINS')]

# or use more specific function

from email.utils import getaddresses

# DJANGO_ADMINS=Full Name <email-with-name@example.com>,anotheremailwithoutname@example.com
ADMINS = getaddresses([env('DJANGO_ADMINS')])

Multiline value

You can set a multiline variable value:

# MULTILINE_TEXT=Hello\\nWorld
>>> print env.str('MULTILINE_TEXT', multiline=True)
Hello
World

Proxy value

You can set a value prefixed by $ to use as a proxy to another variable value:

# BAR=FOO
# PROXY=$BAR
>>> print env.str('PROXY')
FOO

Multiple env files

It is possible to have multiple env files and select one using environment variables.

env = environ.Env()
env.read_env(env.str('ENV_PATH', '.env'))

Now ENV_PATH=other-env ./manage.py runserver uses other-env while ./manage.py runserver uses .env.

Tests

$ git clone git@github.com:joke2k/django-environ.git
$ cd django-environ/
$ python setup.py test

How to Contribute

  1. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a Contributor Friendly tag for issues that should be ideal for people who are not very familiar with the codebase yet.

  2. Fork the repository on GitHub to start making your changes to the develop branch (or branch off of it).

  3. Write a test which shows that the bug was fixed or that the feature works as expected.

  4. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to Authors file.

License

This project is licensed under the MIT License - see the License file file for details

Changelog

See the Changelog file which format is inspired by Keep a Changelog.

Credits

Metadata

Release files for django-environ-alt 0.4.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-environ-alt 0.4.6
File Size Uploaded
django-environ-alt-0.4.6.tar.gz 24.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-environ-alt 0.4.6
File Interpreter ABI Platform
django_environ_alt-0.4.6-py2.py3-none-any.whl Python 3, Python 2 none any Details

Total release size: 48.3 kB

Release files / django-environ-alt-0.4.6.tar.gz

Download URL django-environ-alt-0.4.6.tar.gz
Size 24.5 kB
Tags Source
SHA-256 checksum
How to use checksums
a907e16495f37b93d5c33d2512b76bcd824e2bb37d58ba4f3b96cab200870b66
BLAKE2b-256 checksum
How to use checksums
3f51eb2fb51d4b94dc742f7daa23364ca823ddb452d0405607cb0c1333e562ef
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.8.0 tqdm/4.31.1 CPython/3.7.3

Release files / django_environ_alt-0.4.6-py2.py3-none-any.whl

Download URL django_environ_alt-0.4.6-py2.py3-none-any.whl
Size 23.8 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
c982dcf53b83c0bd57e7215dd1de073e49b062d2c962152174cafa96d5677e7c
BLAKE2b-256 checksum
How to use checksums
d20e7ca1bbeb8af6d8ed6696c80cb4fafefff3f14babf132fb2f6a9466c1e1d3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.8.0 tqdm/4.31.1 CPython/3.7.3

Release history Release notifications | RSS feed

This release

0.4.6 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page