Skip to main content

Application settings helper for Django apps.

Project description

Django AppSettings

Application settings helper for Django apps.

Why another app settings app? Because none of the other suited my needs!

This one is simple to use, and works with unit tests overriding settings.

Installation

pip install django-app-settings

Documentation

On ReadTheDocs

Development

To run all the tests: tox. See CONTRIBUTING.

Quick usage

# Define your settings class
import appsettings


class MySettings(appsettings.AppSettings):
    boolean_setting = appsettings.BooleanSetting(default=False)
    required_setting = appsettings.StringSetting(required=True)
    named_setting = appsettings.IntegerSetting(name='integer_setting')
    prefixed_setting = appsettings.ListSetting(prefix='my_app_')

    class Meta:
        setting_prefix = 'app_'


# Related settings in settings.py
APP_INTEGER_SETTING = -24
MY_APP_PREFIXED_SETTING = []


# Instantiate your class wherever you need to
appconf = MySettings()
assert appconf.boolean_setting is False  # True (default value)
assert appconf.required_setting == 'hello'  # raises AttributeError
assert appconf.named_setting < 0  # True
assert appconf.prefixed_setting  # False (empty list)


# Values are cached to avoid perf issues
with override_settings(APP_REQUIRED_SETTING='hello',
                       APP_INTEGER_SETTING=0):
    # ...but cache is cleaned on Django's setting_changed signal
    assert appconf.required_setting == 'hello'  # True
    assert appconf.named_setting < 0  # False


# You can still access settings through the class itself (values not cached)
print(MySettings.boolean_setting.get_value())  # explicit call
print(MySettings.boolean_setting.value)  # with property


# Run type checking and required presence on all settings at once
MySettings.check()  # raises Django's ImproperlyConfigured (missing required_setting)
# MySettings.check() is best called in django.apps.AppConfig's ready method

You can easily create your own Setting classes for more complex settings.

import re

import appsettings
from django.core.exceptions import ValidationError


class RegexSetting(appsettings.Setting):
    def validate(self, value):
        re_type = type(re.compile(r'^$'))
        if not isinstance(value, (re_type, str)):
            # Raise ValidationError
            raise ValidationError('Value must be a string or a compiled regex (use re.compile)')

    def transform(self, value):
        # ensure it always returns a compiled regex
        if isinstance(value, str):
            value = re.compile(value)
        return value

Please check the documentation to see even more advanced usage.

License

Software licensed under ISC license.

Changelog

Unreleased

0.7.2 (2023-09-07)

  • Deprecate loding setting values from environment (#98 by @stinovlas)

  • Fix optional nested dict setting (#92 by @rastytheamateur)

  • Fix typos in usage.rst (#102 by @oto-stefan)

  • Fix docs build (#100 by @stinovlas)

0.7.1 (2020-05-28)

  • Ignore environment variables when using override_settings.

  • Don’t announce type annotations.

0.7.0 (2020-04-14)

  • Read setting values from environment variables.

  • Add FileSetting.

  • Fix bug causing NestedDictSetting to be always required.

  • Add support for python 3.8 and Django 3.0.

  • Drop support for python 2.7 and 3.4.

  • Drop deprecated type checkers.

  • Add type annotations.

  • Raise ImproperlyConfigured from Setting.check for all errors in a setting.

  • Move repository to https://github.com/pawamoy/django-appsettings.

  • Clean tests.

0.6.1 (2020-03-04)

  • Fix transform_default in NestedListSetting, by @stinovlas (see PR #61).

0.6.0 (2019-08-27)

  • Add CallablePathSetting (see issue #49 and PR #52).

  • Add NestedListSetting (see issue #50 and PR #53).

  • Rename NestedSetting to NestedDictSetting (old name is still available but deprecated).

0.5.1 (2019-05-23)

  • Fix default values for empty arguments.

0.5.0 (2018-12-03)

  • Deprecate setting checkers in favor of validators, similarly to Django form fields.

0.4.0 (2018-07-25)

  • Add NestedSetting for easy management of nested settings.

0.3.0 (2017-11-30)

Going from alpha to beta status. Logic has been reworked.

  • An instance of a subclass of AppSettings will now dynamically get settings values from project settings, and cache them. This allows to use the instance the same way in code and tests, without performance loss. See issue #16.

  • Cache is invalidated when Django sends a setting_changed signal (i.e. when using TestCase or override_settings). See issue #16.

  • Setting main class now accepts callable as default value, and two new parameters to keep control on its behavior: call_default, which tells if the default value should be called (if callable) or not, and transform_default, which tells if the default value should be transformed as well by the transform method. See issue #17.

  • Settings type checkers now have custom parameters like max_length, empty or key_type, that can be passed directly through the settings classes as keyword arguments. Check the documentation for more information.

  • Settings classes have been rewritten more explicitly, using class inheritance instead of hard-to-debug generators. Composed types like float lists or boolean sets have been removed in favor of more flexible list, set and tuple types which now accept an optional item_type parameter.

  • ImportedObjectSetting has been renamed ObjectSetting, and now supports object paths down to arbitrary level of nesting. Before, it only supported object paths down to classes or functions, now you can for example give it the path to a constant in a class within a class, itself contained in a module within a package. It will work as long a the deepest module is importable through importlib.import_module and each object down to the last is obtainable through getattr method.

Many thanks to ziima for having shared good ideas and thoughts!

0.2.5 (2017-06-02)

  • Add six dependency (now required).

  • Rename Int settings to Integer, and Bool ones to Boolean.

  • Remove metaclass generated getters and checkers.

0.2.4 (2017-05-02)

  • Settings are not checked when they default to the provided default value.

  • Settings classes received better default values corresponding to their types.

0.2.3 (2017-05-02)

  • Add full_name property to Setting class.

  • Add required parameter to Setting class (default False).

0.2.2 (2017-04-17)

  • Import settings classes in main module to simplify imports.

0.2.1 (2017-04-17)

  • Add PositiveInt and PositiveFloat settings.

  • Add support for Django 1.11.

  • Implement basic settings classes.

0.2.0 (2017-04-17)

  • Implement basic Setting class.

  • Pin dependencies.

  • Change distribution name to app-settings.

0.1.0 (2017-03-23)

  • Alpha release on PyPI.

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-app-settings-0.7.2.tar.gz (35.2 kB view details)

Uploaded Source

Built Distribution

django_app_settings-0.7.2-py2.py3-none-any.whl (14.6 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file django-app-settings-0.7.2.tar.gz.

File metadata

  • Download URL: django-app-settings-0.7.2.tar.gz
  • Upload date:
  • Size: 35.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.10

File hashes

Hashes for django-app-settings-0.7.2.tar.gz
Algorithm Hash digest
SHA256 9223480aeef00dec8f89ee603454309993726b263f4f975ee7be98918c5ae27b
MD5 def6c7a73b9e68f3712b44381953e18e
BLAKE2b-256 c4277141e90d1e4984722a5d0dc0c50203bdc14832a58e481cd89f2a1c87652d

See more details on using hashes here.

File details

Details for the file django_app_settings-0.7.2-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for django_app_settings-0.7.2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 438a3e1a9168825ad39c7e7ad1bc3c28fc17a128d117c4a702f5958abceee4fe
MD5 678a56efc48559d294dea25e4c7016f4
BLAKE2b-256 d909db382672f6d1cb99f4509b9001307550ba084637abdfcfd00bc352449d00

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