Contents
If you are a Python developer who likes to keep application configuration in simple Python modules and that your app have some default settings and production/dev/test setting files, converge can help you merge settings and start the application with desired settings based on environment variables.
./settings/default_settings.py
-------------------
SERVER_PORT = 8000
DOMAIN = 'example.com'
ADMIN_EMAIL = '[email protected]'
./settings/dev_settings.py
---------------
SERVER_PORT = 9000
import settings
print(settings.SERVER_PORT) # 9000
print(settings.DOMAIN) # example.com
print(settings.get('VAR_THAT_DOESNT_EXIST')) # None
pip install converge
_All directives are optional._
APP_MODE
Valid values are
- dev (default)
- test
- staging
- beta
- prod
Based on mode
appropriate settings module would be used (if available)
SETTINGS_DIR
Defaults to "settings".
If your settings files are in different directory, use SETTINGS_DIR to point converge to correct path.
Note
Remember to drop __init__.py in settings directory.
GIT_SETTINGS_REPO
Fetching application settings from a git repository is supported too. If such configuration is specified, git repository is cloned into SETTINGS_DIR.
GIT_SETTINGS_SUBDIR
In case you - use same git repository to host configurations of more than one applications and - say settings files are in different subdirectories
Example
my-git-repo/ | |- myapp1 | | | |- default_settings.py | |- prod_settings.py | | |- myapp2
export SETTINGS_DIR='appsettings' export GIT_SETTINGS_REPO='[email protected]:shon/converge-test-settings.git' export GIT_SETTINGS_SUBDIR='myapp1'
In this case all *_settings.py files in myapp1/ would be copied to appsettings.
Example
export APP_MODE='test' export SETTINGS_DIR='settings' export GIT_SETTINGS_REPO='[email protected]:shon/converge-test-settings.git' export GIT_SETTINGS_SUBDIR='myapp1'
- Defaults: default_settings.py
- Mode
- production: prod_settings.py
- development: dev_settings.py
- test: test_settings.py
- staging: staging_settings.py
- beta: beta_settings.py
- Deployment specific: site_settings.py
Settings files are usual Python files that can contain valid python code however here are some guidelines for user
Use module variables for global application wide configuration
Use UPPERCASE while naming settings variables
For values prefer basic python datatypes such as string, integer, tuples
eg.
SERVER_PORT = 1234
Avoid complex python operations
- Use simple classes for config sections
class DB: HOST = 'db.example.com' PORT = 1234
- Use simple string operations to avoid repetition
BASE_DOMAIN = 'example.com' API_URL = 'api.' + BASE_DOMAIN``
Defining module veriables in site_settings.py
default_settings.py
SERVER_PORT = 9999
site_settings.py
SERVER_PORT = 8888
Example:
default_settings.py
class DB:
HOST = 'db.example.com'
PORT = 1234
site_settings.py
DB.PORT = 1111
In case if you want to keep all settings.py files in a directory. Use SETTINGS_DIR environment variable.
export APP_MODE='prod'
export SETTINGS_DIR='settings/fat_server'
This is useful when you have to deploy multiple instances of an app with different configs
`-- settings/ | |-- server1/ | | | |--default_settings.py | |--prod_settings.py | |-- server2/ | |--default_settings.py | |--prod_settings.py | |