Login

Different approach to local settings.py

Author:
jokull
Posted:
February 15, 2008
Language:
Python
Version:
.96
Tags:
settings development deployment
Score:
6 (after 6 ratings)

I like to keep all local settings files in my versioning repository. The way I differentiate between them is by querying the hostname of the local machine. I've got a host_settings folder with local settings files. Notice that the local settings file names go by a convention where '.' is replaced with underscores.

Example: host_settings/local_machine_tld.py

1
2
3
4
5
6
try:
    import socket
    hostname = socket.gethostname().replace('.','_')
    exec "from host_settings.%s import *" % hostname
except ImportError, e:
    raise e

More like this

  1. Read settings from local_settings.py by statico 5 years, 6 months ago
  2. Django Settings Splitter & Local Settings loader by rudude 1 year, 4 months ago
  3. manage.py with magic python path by bikeshedder 8 years, 1 month ago
  4. currency filter without using locale by andzep 4 years, 5 months ago
  5. invoke pyflakes via manage.py by mpasternacki 5 years, 9 months ago

Comments

whiskybar (on February 15, 2008):

Very useful indeed. I use a similar approach:

settings.py:

import socket
hostname = socket.gethostname()
if hostname == 'apples':
    DATABASE_NAME = 'juice'
    DATABASE_USER
    etc.
elif hostname == 'pears':
    etc.
etc.

I have a question though. Somebody told me this may not work in Mac or Windows. Have you tried that?

#

jokull (on February 15, 2008):

I haven't tried it out on Windows but OSX correctly returns the hostname.

#

itavor (on February 17, 2008):

Wow, what a great idea!

More code, shorter filenames:

import socket
hostname = socket.gethostname().split('.')
while True:
    try:
        exec 'from host_settings.%s import *' % '_'.join(hostname)
        break
    except ImportError:
        hostname = hostname[:-1]

#

luftyluft (on February 17, 2008):

Use of "exec" will scare some users away from this snippet. There may be valid use cases for exec, but many Python programmers IMHO avoid the use of it like the plague. Kind of like a goto statement in a C program - it's just not done :)

Using the built-in _import_ might be the way to go.

#

jokull (on February 23, 2008):

I tried to do something with import but it doesn't seem to support the from x import * syntax. Am I wrong?

#

buriy (on February 24, 2008):

working well on windows.

i'd like to change snippet a bit:

try:
    import socket
    hostname = socket.gethostname().replace('.','_')
    __import__("settings_%s" % hostname)
except ImportError, e:
    import sys
    sys.stderr.write('Unable to read settings_%s.py\n' % hostname)
    sys.exit(1)

#

buriy (on February 25, 2008):

oops, guys, you're right. i have to read how to do "from ... import *" with import.

#

Please login first before commenting.