Skip to main content

Custom settings management for Django

Project description

Django Convigvars

Configure your Django project in easy and readable way.

Description

Configvars gives possibility to configure Django-based project with local file and environment variables (i.e. for Docker containers).

Environmental variables are the most important. If not set, the variables from the local module will be used, or if these are not present either - the default values will be used:

ENV > LOCAL > DEFAULT

Installation

pip install git+https://gitlab.com/marcinjn/django-configvars.git

Basic configuration

Add configvars to your settings.INSTALLED_APPS:

INSTALLED_APPS = [
    # ...
    "configvars",
    # ...
]

Quickstart

In your settings.py add these lines at the top of the file:

from convigvars import config, secret

SOME_API_KEY = config("SOME_API_KEY", "default_api_key")
SOME_API_SECRET = secret("SOME_API_SECRET", "")

Then use local settings to set these values or pass them by environment variables. To use local file, add these settings to local.py file in the same folder where settings.py file is located, and fill it with:

SOME_API_KEY = "NEW_API_KEY"
SOME_API_SECRET = "NEW_API_SECRET"

To check if they are apllied propely run manage.py configvars.

You can override these settings by using environment vars (i.e. for deployment in containers). To do so just declare an environment variable as usual:

SOME_API_KEY="ENV_API_KEY" manage.py configvars

In case of secrets, you should provide a path to the secret file containing a value:

SOME_API_SECRET="/run/secrets/SOME_API_SECRET" manage.py configvars

If file does not exist, the path will be interpreted as typical string value.

Usage

Config vars declaration

In your settings.py file declare configurable variables by using config or secret functions. The first one is used for regular variables, the second one - for secure variables (like passwords, secrets, etc).

DATABASES = {
    "default": {
        "NAME": config("DB_NAME", "example"),   # `example` as default database name
        "USER": config("DB_USER", "postgres"),  # `postgres` as default username
        "PASSWORD": secret("DB_PASSWORD"),
        "HOST": config("DB_HOST", "localhost"), # `localhost` as default host
        "PORT": config("DB_PORT", 5432),        # `5432` as default port
    }
}

Show configurable variables for your project

python manage.py configvars

Should result in something like that:

DB_NAME = 'example'
DB_USER = 'postgres'
DB_PASSWORD = None
DB_HOST = 'localhost'
DB_PORT = 5432

Show only changed config variables

To show changed config variables by local.py or environment variables use:

python manage.py configvars --changed

Adding short description to your config variables

In your settings.py declare config or secret with additional desc argument:

MY_CUSTOM_VARIABLE = config("MY_CUSTOM_VARIABLE", "default_value", desc="Set's custom variable")

Then you can dump your config variables with descriptions:

$ python manage.py configvars --comment

MY_CUSTOM_VARIABLE = 'default_value'  # Set's custom variable

Local settings

Django Configvars will try to import <projectname>.local module by default. By using this file you can customize your config variables - they will be used as current values.

To do so, create empty local.py in directory where your settings.py file is located, then assign values to your variables.

As local config variables are specific to a local machine, consider adding local.py to .gitignore.

Note that:

  • Local settings can be overriden by environment variables
  • Local settings can be skipped for your project

To change location or name of your local settings file, you must initialize Django Configvars explicitely in settings.py module:

from configvars import initialize

initialize("other.location.of.settings_local")

Environment variables

Django Config vars will check at the first whether environment name of the variable is defined. It is important for deployments in containers, where configuration variables are passed mostly by environment variables.

If environment variable does not exist, a local variable will be used. If local value is not defined, a default value will be used.

Environment variables can be prefixed to solve issues with eventual name conflicts. To do so you must initialize Django Configvars explicitely in settings.py file:

from configvars import initialize

initialize(env_prefix="MYPREFIX_")

Support

To ask question please create an issue.

To do

  • better support for type casts
  • config vars view for Django Admin

Contributing

You can contribute by creating issues, feature requests or merge requests.

Authors and acknowledgment

  • Marcin Nowak

License

ISC License

Copyright (c) 2023 Marcin Nowak

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-configvars-0.3.tar.gz (5.7 kB view details)

Uploaded Source

Built Distribution

django_configvars-0.3-py3-none-any.whl (5.9 kB view details)

Uploaded Python 3

File details

Details for the file django-configvars-0.3.tar.gz.

File metadata

  • Download URL: django-configvars-0.3.tar.gz
  • Upload date:
  • Size: 5.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.10

File hashes

Hashes for django-configvars-0.3.tar.gz
Algorithm Hash digest
SHA256 2e63c121f0967f18868d88c06ab205eb1ca700f1cb5dd132c53b2a5104b6758d
MD5 f75eb99b8ecb23107bc70aa2ced08549
BLAKE2b-256 e72d0305b06d58a840de475112d637fba9b2380c0907753ec85241a9ae493344

See more details on using hashes here.

File details

Details for the file django_configvars-0.3-py3-none-any.whl.

File metadata

File hashes

Hashes for django_configvars-0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 5c3f5fbc21df70ff5a62562fa30704c7d3043aa30977bd5a387e3a772bad70e7
MD5 61fe5ab319b6d39f06e0a64429b9bb01
BLAKE2b-256 25dc3cce01be50c4111173c06ba34e299995fc82587dee0e54dfca5df124f2ce

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page