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.PydanticSettings) 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.1+ (which means Django 1.11 and on), but is only tested against officially supported versions (currently 2.2, 3.0, and 3.1).

Note: as of django-pydantic-settings 0.4.0, Pydantic 1.8+ is required, which means Python 3.6.1+ is also required. If you need to use Python 3.6, you'll need to stick with django-pydantic-settings <0.4.0.

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.PydanticSettings 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.

Required settings

There are no settings that must be configured in order to use Django with django-pydantic-settings. All of the possible settings defined by Django (Settings Reference) are configured in the pydantic_settings.settings.PydanticSettings class, using their normal default values provided by Django, or a reasonable calculated value. Settings worth thinking about are ROOT_URLCONF and WSGI_APPLICATION, which, unless otherwise specified, are calculated based on your DJANGO_SETTINGS_MODULE assuming that you're using the default Django project layout a provided by django-admin.py startproject. So, for example, if your DJANGO_SETINGS_MODULE is set to my_awesome_project.settings.PydanticSettingsSubclass, then ROOT_URLCONF and WSGI_APPLICATION will be set to my_awesome_project.urls and my_awesome_project.wsgi respectively. This default behavior can be overridden by simply specifying ROOT_URLCONF:str = 'the_actual_urlconf' and WSGI_APPLICATION:str = 'the_actual_wsgi_file.application' in your PydanticSettings sub-class. Alternatively, rather than individually settings the ROOT_URLCONF and WSGI_APPLICATION settings, you can set BASE_DIR, and that will be used instead of DJANGO_SETTINGS_MODULE.

The other setting worth thinking about is SECRET_KEY. By default, SECRET_KEY is automatically generated using Django's own get_random_secret_key() function. This will work just fine, though as it will be re-calculated every time your PydanticSettings sub-class is instantiated, you should set this to somethign static if you're using Django's authentication and don't want to lose your session every time the server is restarted.

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. In order to support Google Cloud SQL database connections from within Google Cloud Run, the DatabaseDsn type will detect and automatically escape DSN strings of the form postgres://username:password@/cloudsql/project:region:instance/database so that they can be properly handled by dj-database-url.

class DatabaseSettings(BaseSettings):
    default: DatabaseDsn = Field(env="DATABASE_URL")
    secondary: DatabaseDsn = Field(env="SECONDARY_DATABASE_URL")
 DATABASE_URL=postgres://username:password@/cloudsql/project:region:instance/database SECONDARY_DATABASE_URL=sqlite:///foo poetry run python settings_test/manage.py shell
Python 3.9.1 (default, Jan 12 2021, 16:45:25) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from rich import print
>>> from django.conf import settings
>>> print(settings.DATABASES)
{
    'default': {
        'NAME': 'database',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': '/cloudsql/project:region:instance',
        'PORT': '',
        'CONN_MAX_AGE': 0,
        'ENGINE': 'django.db.backends.postgresql_psycopg2'
    },
    'secondary': {'NAME': 'foo', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', 'CONN_MAX_AGE': 0, 'ENGINE': 'django.db.backends.sqlite3'}
}
>>> 

Sentry configuration

django-pydantic-settings provides built-in functionality for configuring your Django project to use Sentry. The simplest way to use this is to inherit from pydantic_settings.sentry.SentrySettings rather than pydantic_settings.settings.PydanticSettings. This adds the setting SENTRY_DSN, which uses the pydantic_settings.sentry.SentryDsn type. This will automatically be set according to the DJANGO_SENTRY_DSN environment variable, and expects a Sentry DSN (obviously). It validates that the provided DSN is a valid URL, and then automatically initializes the Sentry SDK using the built-in DjangoIntegration. Using this functionality required sentry-sdk to be installed, which will be included automatically if you install django-pydantic-settings[sentry].

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.4.0.tar.gz (12.2 kB view details)

Uploaded Source

Built Distribution

django_pydantic_settings-0.4.0-py3-none-any.whl (10.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: django-pydantic-settings-0.4.0.tar.gz
  • Upload date:
  • Size: 12.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.4 CPython/3.9.1 Linux/4.19.121-linuxkit

File hashes

Hashes for django-pydantic-settings-0.4.0.tar.gz
Algorithm Hash digest
SHA256 9270e7b46ef0088360ca9e319fc0fcaedb0959cd44ba5354296ab44243266554
MD5 ba9c2d62dcd7f43f29d9d8d7abe44a46
BLAKE2b-256 1f32d042dc2e47dc46a2bcb4d0e69d98241bfd7ba385685e2535721d10c35909

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for django_pydantic_settings-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f60e4d8eea53b138b8b3543b684ebd057231d6237a74ef844368df222dbdce26
MD5 db3733a91fcdf1047bd7317e66ba79b6
BLAKE2b-256 e69d866a657d85a1b2df50d4f431ab499323f0a93231868b9f4ea130bbafb8bc

See more details on using hashes here.

Provenance

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