Changes between Version 16 and Version 17 of SplitSettings


Ignore:
Timestamp:
Sep 16, 2011, 12:00:14 AM (13 years ago)
Author:
karim.nassar@…
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SplitSettings

    v16 v17  
    404404print CONFIGURATION # prints 'cordis'
    405405}}}
     406
     407=== Setting Inheritance with Hierarchy ===
     408
     409I need to be able to inherit from a base settings file, then for each environment provide overrides. In dev env, we need developer specific settings. The following extends [http://djangopeople.net/cordis  Sergey Yushckeyev's] solution above:
     410
     411{{{settings/__init__.py}}}
     412{{{
     413#!python
     414import os, pwd
     415
     416# certain keys we want to merge instead of copy
     417merge_keys = ('INSTALLED_APPS', 'MIDDLEWARE_CLASSES')
     418
     419def deep_update(from_dict, to_dict):
     420    for (key, value) in from_dict.iteritems():
     421        if key in to_dict.keys() and isinstance(to_dict[key], dict) and isinstance(value, dict):
     422            deep_update(value, to_dict[key])
     423        elif key in merge_keys:
     424            if not key in to_dict:
     425                to_dict[key] = ()
     426            to_dict[key] = to_dict[key] + from_dict[key]
     427        else:
     428            to_dict[key] = value
     429
     430# this should be one of prod, qa, staging, dev. default to dev for safety
     431env = os.environ.get('APP_ENV', 'dev')
     432
     433# try to load user specific settings
     434uid = pwd.getpwuid(os.getuid())[0]
     435
     436modules = ('common', env, uid)
     437current = __name__
     438for module_name in modules:
     439    try:
     440        module = getattr(__import__(current, globals(), locals(), [module_name]), module_name)
     441    except ImportError, e:
     442        print 'ERROR: Unable to import %s configuration: %s' % (module_name, e)
     443        raise
     444    except AttributeError, e:
     445        if env == 'dev' and module_name == uid:
     446            print 'WARNING: Unable to import %s dev configuration: does %s.py exist?' % (module_name, module_name)
     447        else:
     448            raise
     449
     450    # create a local copy of this module's settings
     451    module_settings = {}
     452    for setting in dir(module):
     453        # all django settings are uppercase, so this ensures we
     454        # are only processing setting from the dir() call
     455        if setting == setting.upper():
     456            module_settings[setting] = getattr(module, setting)
     457    deep_update(module_settings, locals())
     458
     459#print locals() # for debugging
     460}}}
     461
     462Then, move {{{settings.py}}} to {{{common.py}}}.
     463
     464
     465The above defaults to {{{dev}}} env. You could pass in anything to {{{manage.py}}} via the {{{APP_ENV}}} environment variable. Common ones would be {{{prod}}}, {{{staging}}}, {{{qa}}}, etc. For each {{{APP_ENV}}}, you create a file {{{$APP_ENV.py}}}. Finally, create {{{$USER.py}}} file with overrides. Example files (excepting settings.py) below..
     466
     467{{{dev.py}}}
     468{{{
     469#!python
     470import os
     471
     472# cwd is settings. determine project path
     473cwd = os.path.dirname(os.path.abspath(__file__))
     474project_path = cwd[:-9] # chop off "settings/"
     475
     476DEBUG = True
     477TEMPLATE_DEBUG = DEBUG
     478
     479TEMPLATE_DIRS = (
     480    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
     481    # Always use forward slashes, even on Windows.
     482    # Don't forget to use absolute paths, not relative paths.
     483
     484    # project templates directory
     485    '%s/templates' % ( project_path )
     486)
     487}}}
     488
     489{{{$USER.py}}}
     490{{{
     491#!python
     492DATABASES = {
     493    'default': {
     494        'USER': 'me',           
     495        'PASSWORD': 'i<3django',
     496    }
     497}
     498
     499INSTALLED_APPS = (
     500    'haystack',
     501)
     502
     503HAYSTACK_CONNECTIONS = {
     504    'default': {
     505        'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
     506        'URL': 'http://127.0.0.1:8983/solr'
     507    },
     508}
     509}}}
Back to Top