Skip to content

Instantly share code, notes, and snippets.

@pedroburon
Created October 25, 2018 13:31
Show Gist options
  • Save pedroburon/5609608716f9c0f7df79269edbde6f89 to your computer and use it in GitHub Desktop.
Save pedroburon/5609608716f9c0f7df79269edbde6f89 to your computer and use it in GitHub Desktop.
from django.conf import settings as django_settings
class Setting(object):
def __init__(self, name):
self.name = name
def __get__(self, instance, owner):
return self.get_value()
def __set__(self, instance, value):
raise TypeError("Cannot assign value to setting.")
def get_value(self):
raise NotImplementedError
class DefaultSetting(Setting):
def __init__(self, name, default):
super(DefaultSetting, self).__init__(name)
self.default = default
def get_value(self):
return getattr(django_settings, self.name, self.default)
class VaultSetting(Setting):
def __init__(self, name):
self.name = name
def __get__(self, instance, owner):
return self.get_value()
def __set__(self, instance, value):
raise TypeError("Cannot assign value to vault.")
def get_value(self):
return self.get_vault_key(self.name)
def get_vault_key(self, name):
print("go vault setting", name)
return name
class CachedVaultSetting(VaultSetting):
def __init__(self, name):
super(CachedVaultSetting, self).__init__(name)
self.value = None
def get_value(self):
if self.value is None:
self.value = self.get_vault_key(self.name)
return self.value
class AppSettings(object):
_instances = {}
def __new__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(AppSettings, cls).__new__(cls, *args, **kwargs)
return cls._instances[cls]
def __getattr__(self, name):
return getattr(django_settings, name)
class Settings(AppSettings):
VAULT_SETTING = CachedVaultSetting('VAULT_KEY')
DEFAULT_SETTING = DefaultSetting('TIMEOUT', 10)
settings = Settings()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment