Skip to content

Instantly share code, notes, and snippets.

@pszpetkowski
Created February 6, 2017 02:30
Show Gist options
  • Save pszpetkowski/6a6080bd63a7ce0a3009f308c00a1838 to your computer and use it in GitHub Desktop.
Save pszpetkowski/6a6080bd63a7ce0a3009f308c00a1838 to your computer and use it in GitHub Desktop.
import os
import pathlib
import sys
import dj_database_url
class SettingsBase(type):
"""Class-based settings meta class"""
def __new__(mcs, classname, bases, classdict):
for key in list(classdict):
fail_conditions = (
type(key) != str or
not key[0].isalnum() or
'__call__' in dir(classdict[key]) or
isinstance(classdict[key], classmethod)
)
if fail_conditions:
continue
classdict[key.upper()] = classdict[key]
return type.__new__(mcs, classname, bases, classdict)
class Settings(metaclass=SettingsBase):
# Django base settings
site_id = 1
root_urlconf = 'config.urls'
base_dir = pathlib.Path(__file__).parents[2].resolve()
atomic_requests = True
debug = None
wsgi_application = 'config.wsgi.application'
@property
def secret_key(self):
return self.get_env_var('SECRET_KEY', 'totally-insecure')
# Apps / middleware / templates
@property
def installed_apps(self):
return [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users.apps.UsersConfig',
]
@property
def middleware(self):
return [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
@property
def templates(self):
return [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [str(self.base_dir / 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
# Databases / caches
@property
def databases(self):
return {
'default': dj_database_url.config(
default='postgres://user:pass@localhost:5432/db',
conn_max_age=600
)
}
# Project config
auth_user_model = 'users.User'
auth_password_validators = [
{
'NAME': ('django.contrib.auth.password_validation.'
'UserAttributeSimilarityValidator'),
},
{
'NAME': ('django.contrib.auth.password_validation.'
'MinimumLengthValidator'),
},
{
'NAME': ('django.contrib.auth.password_validation.'
'CommonPasswordValidator'),
},
{
'NAME': ('django.contrib.auth.password_validation.'
'NumericPasswordValidator'),
},
]
language_code = 'en-us'
time_zone = 'UTC'
use_i18n = True
use_l10n = True
use_tz = True
# static files
static_url = '/static/'
# helper classes
@classmethod
def get_env_var(cls, key, default=None):
try:
return os.environ[key]
except KeyError:
if default is not None:
return default
else:
raise ValueError(
'Undefined value for `{}` environment variable at {}'
' settings class.'.format(key, cls)
)
@classmethod
def load_settings(cls, module_name):
self = cls()
module = sys.modules[module_name]
for key in dir(self):
if key.upper() and not key.startswith('_'):
setattr(module, key, getattr(self, key))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment