Skip to main content

Manage Django settings with Pydantic.

Project description

django-pydantic-settings

Use pydantic settings management to simplify configuration of Django settings.

Very much a work in progress, but reads the standard DJANGO_SETTINGS_MODULE environment variable (defaulting to pydantic_settings.Settings) to load a sub-class of pydantic_settings.Settings. All settings (that have been defined in pydantic_settings.Settings) can be overridden with environment variables. A special DatabaseSettings class is used to allow multiple databases to be configured simply with DSNs. In theory, django-pydantic-settings should be compatible with any version of Django that runs on Python 3.6+ (which means Django 1.11 and on), but has so far only been tested against Django 3.1.

Installation & Setup

Install django-pydantic-settings:

pip install django-pydantic-settings

Modify your Django project's manage.py file to use django-pydantic-settings, it should look something like this:

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import sys

from pydantic_settings import SetUp


def main():
    """Run administrative tasks."""
    SetUp().configure()

    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == "__main__":
    main()

Your wsgi.py and/or asgi.py files will need to be modified similarly, and look something like this:

from django.core.wsgi import get_wsgi_application

from pydantic_settings import SetUp

SetUp().configure()
application = get_wsgi_application()

The SetUp class will automatically look for the standard DJANGO_SETTINGS_MODULE environment variable, read it, confirm that it points to an existing Python module, and load that module. Your DJANGO_SETTINGS_MODULE variable should point to a pydantic_settings.settings.Settings sub-class (though technically any Python class that defines a dict() method which returns a Python dictionary of key/value pairs matching the required Django settings will work). Calling the configure() method will then use the specified module to configure your project's Django settings.

Database configuration

By defining multiple DatabaseDsn attributes of the DatabaseSettings class, you can easily configure one or more database connections with environment variables. DSNs are parsed using dj-database-url.

class DatabaseSettings(BaseSettings):
    default: DatabaseDsn = Field(env="DATABASE_URL")
    secondary: DatabaseDsn = Field(env="SECONDARY_DATABASE_URL")
 DATABASE_URL=sqlite:///foo SECONDARY_DATABASE_URL=sqlite:///bar ./settings_test/manage.py shell
Python 3.9.1 (default, Jan  8 2021, 17:17:43)
[Clang 12.0.0 (clang-1200.0.32.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.conf import settings
...
>>> pp.pprint(settings.DATABASES)
{   'default': {   'ATOMIC_REQUESTS': False,
                   'AUTOCOMMIT': True,
                   'CONN_MAX_AGE': 0,
                   'ENGINE': 'django.db.backends.sqlite3',
                   'HOST': '',
                   'NAME': 'foo',
                   'OPTIONS': {},
                   'PASSWORD': '',
                   'PORT': '',
                   'TEST': {   'CHARSET': None,
                               'COLLATION': None,
                               'MIGRATE': True,
                               'MIRROR': None,
                               'NAME': None},
                   'TIME_ZONE': None,
                   'USER': ''},
    'secondary': {   'CONN_MAX_AGE': 0,
                     'ENGINE': 'django.db.backends.sqlite3',
                     'HOST': '',
                     'NAME': 'bar',
                     'PASSWORD': '',
                     'PORT': '',
                     'USER': ''}}
>>>

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-pydantic-settings-0.1.6.tar.gz (5.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_pydantic_settings-0.1.6-py3-none-any.whl (6.3 kB view details)

Uploaded Python 3

File details

Details for the file django-pydantic-settings-0.1.6.tar.gz.

File metadata

  • Download URL: django-pydantic-settings-0.1.6.tar.gz
  • Upload date:
  • Size: 5.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.4 CPython/2.7.16 Darwin/20.3.0

File hashes

Hashes for django-pydantic-settings-0.1.6.tar.gz
Algorithm Hash digest
SHA256 36ca46d9d56ed437e3d680da846bae598bbfef6eaceafcd5704e8af0ac6b1918
MD5 58199a5e1fef2842336a3ef2c8d67907
BLAKE2b-256 5b4620e9b81ab921e8a39b143a3fc19023c9ccd1faea7ca5bdc48022a2994092

See more details on using hashes here.

File details

Details for the file django_pydantic_settings-0.1.6-py3-none-any.whl.

File metadata

File hashes

Hashes for django_pydantic_settings-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 f5f5e719c9cf3f34f79e5eb93080cf902f3c6959c40a261a31f71f006b91d0ab
MD5 ce9d0f3023a3e5f2ae3d5027f09f5ec7
BLAKE2b-256 6eca1a3c20884482f02b2239d03cd3b04596a83dee309333b9325880b44a0f85

See more details on using hashes here.

Supported by

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