Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to modularize django settings.py?

Tags:

python

django

When you install a new django application, you have to add/modify your settings.py module.

For a project I'm trying to make that module a python subpackage and create a module for each application:

settings\
    __init__.py
    base.py
    admin.py
    feincms.py
    ...

The problem I'm confronted with is how to merge settings.py attributes (INSTALLED_APPS for example is a tuple of values) that are getting values in the different submodules?

Thanks


Ok, I asked the wrong question (got the right answer for it though). My question should have been, how to get attributes from all submodules and merge them? Django will import settings and expects everything to be there.

like image 578
victor n. Avatar asked Sep 09 '25 20:09

victor n.


2 Answers

"When you install a new django application, you have to add/modify your settings.py module."

I think this is fine as is.

I don't see any reason to change or modify this at all.

What we do, however, is to "subclass" the core settings module.

Our developer-specific and installation-specific files have names like settings_devxy_linux2 and settings_checkout_win32, etc.

Each of these files starts with from settings import * to import the core settings and extend those core settings with overrides for a specific installation and platform.

It doesn't require any real work. It does, however, mean that we do most things with django-admin.py because our settings aren't called settings.

like image 90
S.Lott Avatar answered Sep 12 '25 09:09

S.Lott


You might be interested in this solution; uses execfile() to load a series of settings files in order, where each file has full access to settings from previously-loaded files, to update, modify, etc.

$ ls settings/

10-base.conf
20-engines.conf
30-site.conf
...

$ cat settings.py

import os.path
import glob
conffiles = glob.glob(os.path.join(os.path.dirname(__file__), 'settings', '*.conf'))
conffiles.sort()
for f in conffiles:
    execfile(os.path.abspath(f))
like image 28
Carl Meyer Avatar answered Sep 12 '25 10:09

Carl Meyer