Settings in Django application
-
Upload
tomas-sirny -
Category
Software
-
view
252 -
download
1
Transcript of Settings in Django application
![Page 1: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/1.jpg)
Settings in Django
ApplicationsHandling of settings in various environments
Tomáš Sirný
@junckritter
![Page 2: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/2.jpg)
Default
• 1 file - settings.py
• good for local development
• deploy to production?
• different environments / developer machines
(OSX/Win)
• to git or not to git?
![Page 3: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/3.jpg)
Simple solution
• if-clause for name of production/devel machine
• magic with imports from different files
• manually curated file on production machine
• …
![Page 4: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/4.jpg)
Problems
• Hard to manage different sets of settings
• Copying of files/code snippets in deploy scripts,
test/build configs
• Not replicable if not versioned
• No recommendation in Django documentation
![Page 5: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/5.jpg)
The right way
• based on https://speakerdeck.com/jacobian/the-
best-and-worst-of-django?slide=81 (by Django’s
contributor)
• Two Scoops of Django
![Page 6: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/6.jpg)
![Page 7: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/7.jpg)
Principles
• common parts to base.py
• separate file for each environment
• use env variable DJANGO_SETTINGS_MODULEor CLI parameter --settings= for ./manage.py
• everything is in git
• easy additions/changes of particular setting values
![Page 8: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/8.jpg)
Our setup• __init__.py
• base.py
• helpers.py
• local.tpl.py
• admin.py
• staging.py
• production.py
![Page 9: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/9.jpg)
base.py
• sane defaults - application could (mostly) run as-is
• INSTALLED_APPS, DEBUG, DATABASES,
CACHES
• settings for applications
![Page 10: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/10.jpg)
helpers.py
• code running at the end
• generate final settings based on temporary ones
DEBUG_MODULES = ['action', ‘emails’] in local.py
for module in globals().get('DEBUG_MODULES', []):
LOGGING[‘loggers’][module] = …
![Page 11: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/11.jpg)
local.tpl.py
• template for local development
• good starting point for newcomer
• good place to manifest changes / new settings,
visible in VCS diff
![Page 12: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/12.jpg)
[environment].py
• from .base import *
• …
• execfile(os.path.join(PROJECT_PATH,
'project/settings/helpers.py
![Page 13: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/13.jpg)
[environment].py
• only changes for particular environment
• diff against base.py (or Django’s global settings)
• $DJANGO_SETTINGS_MODULE=[environment].py
![Page 14: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/14.jpg)
Pros
• More control
• Easy check/reference to particular setting
• Easier build/deployment
• Documented changes/defaults
![Page 15: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/15.jpg)
Cons
• Possible duplication for similar environments
(admin, production) - more layers, shared parts
• env variable have to be set everywhere
![Page 16: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/16.jpg)
Tips & tricks
![Page 17: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/17.jpg)
Settings for applications
• settings file is big chunk of code
• all settings in one (or few) place(s)
• harder to find settings for particular application
![Page 18: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/18.jpg)
Our solution
• settings.py in each application with defaults
• app1/settings.py
• app2/settings.py
• global settings file can override
• APP_SETTING =
settings.get(‘GLOBAL_APP_SETTING, ‘default’)
![Page 19: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/19.jpg)
Cache invalidation
• hard problem in CS
• especially during deployment/migration
• format of key is usually tied to version of code
![Page 20: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/20.jpg)
Cache invalidation
in base.py
from subprocess import check_output, CalledProcessError
try:
VERSION = check_output(
'git rev-parse --short=8 HEAD',
shell=True
).strip()
except CalledProcessError:
VERSION = 'test'
![Page 21: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/21.jpg)
Cache invalidation
in production.py
CACHES = {
'default': {
'BACKEND': 'project.cache.EnhancedRedisCache',
'LOCATION': 'redis:6379',
'VERSION': VERSION,
'OPTIONS': {
'DB': 1,
'PASSWORD': '',
'PARSER_CLASS': 'redis.connection.HiredisParser'
}
}
}
![Page 22: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/22.jpg)
One more thing
![Page 23: Settings in Django application](https://reader033.fdocuments.in/reader033/viewer/2022042522/55a521f21a28abba348b47cd/html5/thumbnails/23.jpg)
Migrate Postgres
psql -h <host1> ... -c 'copy (select ... from
<tablename> where …) to stdout' |
psql -h <host2> ... -c 'copy <tablename> from stdin'