Django Docker helpers
Project description
This package provides some useful tools you can use with your manage.py, so you have no need to use bash entry points and non-python scripting. As well it: - reads configs with typing support from env, yaml, redis, consul; - provides some helper functions
Installation
pip install -e git+https://github.com/night-crawler/django-docker-helpers.git#egg=django-docker-helpers
# OR
pip install django-docker-helpers
Utils
env_bool_flag(flag_name, strict) - check if ENV option specified, is it set to true, 1, 0, etc.
run_env_once ensure django management don’t call twice <https://stackoverflow.com/questions/16546652/why-does-django-run-everything-twice>_
is_dockerized - reads DOCKERIZED flag from env
is_production - reads PRODUCTION flag from env
Management Helper functions
ensure_databases_alive(max_retries=100) - tries to execute SELECT 1 for every specified database alias in DATABASES until success or max_retries reached
ensure_caches_alive(max_retries=100) - tries to execute SELECT 1 for every specified cache alias in CACHES until success or max_retries reached
migrate - executes ./manage.py migrate
modeltranslation_sync_translation_fields - run sync_translation_fields if modeltranslation is present
collect_static - alias for ./manage.py collectstatic -c --noinput -v0
create_admin - create superuser from settings.CONFIG['superuser'] if user does not exists and user has no usable password
run_gunicorn(application: WSGIHandler, gunicorn_module_name: str='gunicorn_prod') - runs gunicorn
Sample config
debug: true
db:
engine: django.db.backends.postgresql
host: postgres
port: 5432
database: mydb
user: mydb_user
password: mydb_password
conn_max_age: 60
Read config
import os
from django_docker_helpers.config import ConfigLoader, EnvironmentParser, RedisParser, YamlParser
yml_conf = '/tmp/my/config/without-docker.yml'
redis_conf = os.environ.get('DJANGO_CONFIG_REDIS_KEY', 'msa_cas/conf.yml')
parsers = [
EnvironmentParser(),
RedisParser(endpoint=redis_conf),
YamlParser(config=yml_conf),
]
configure = ConfigLoader(parsers=parsers, silent=True)
DATABASES = {
'default': {
'ENGINE': configure('db.name', 'django.db.backends.postgresql'),
'HOST': configure('db.host', 'localhost'),
'PORT': configure('db.port', 5432),
'NAME': configure('db.database', 'project_default'),
'USER': configure('db.user', 'project_default'),
'PASSWORD': configure('db.password', 'project_default'),
'CONN_MAX_AGE': configure('db.conn_max_age', 60, coerce_type=int),
}
}
Usage
In the most cases your manage.py may look like:
#!/usr/bin/env python
#!/usr/bin/env python
import os
import sys
from django_docker_helpers.db import (
ensure_caches_alive, ensure_databases_alive, migrate
)
from django_docker_helpers.files import collect_static
from django_docker_helpers.management import create_admin, run_gunicorn
from django_docker_helpers.utils import env_bool_flag, run_env_once, wf
from setproctitle import setproctitle
@run_env_once
def invalidate_static_rev():
from django.core.management import call_command
call_command('invalidate_static_rev')
@run_env_once
def load_lang_fixtures():
from django.core.management import call_command
call_command('populate_languages')
@run_env_once
def load_dev_fixtures():
from django.core.management import call_command
wf('Loading DEVELOPMENT fixtures... ', False)
call_command(
'loaddata',
'fixtures/dev/service_api__api_key.json'
)
wf('[DONE]\n')
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_project.settings')
setproctitle('MyProject')
if env_bool_flag('CHECK_CONNECTIONS'):
ensure_databases_alive(100)
ensure_caches_alive(100)
if env_bool_flag('RUN_PREPARE'):
collect_static()
migrate()
invalidate_static_rev()
load_lang_fixtures()
create_admin('SUPERUSER')
if env_bool_flag('LOAD_DEV_FIXTURES'):
load_dev_fixtures()
if len(sys.argv) == 2:
if sys.argv[1] == 'rungunicorn':
from my_project.wsgi import application
gunicorn_module_name = os.getenv('GUNICORN_MODULE_NAME', 'gunicorn_dev')
run_gunicorn(application, gunicorn_module_name=gunicorn_module_name)
exit()
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
Testing
$ pip install -r requirements/dev.txt
Download Consul and unzip it into the project’s directory.
CONSUL_VERSION=1.4.0 bash -c 'curl -sLo consul.zip https://releases.hashicorp.com/consul/"$CONSUL_VERSION"/consul_"$CONSUL_VERSION"_linux_amd64.zip' && unzip consul.zip
$ ./consul agent -server -ui -dev
$ pytest
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for django-docker-helpers-0.1.17.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | a374d5d644a8b7e9eb74f33ae372ead12e22827c836f6ca51bc71d8b87ea9db4 |
|
MD5 | 0190c886035c7bb30612bac486996974 |
|
BLAKE2b-256 | 6c0c8238979fac1769dd946df0cadadcd5e5099f1d1d48490005a53f24e8c9a2 |
Hashes for django_docker_helpers-0.1.17-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b6ce95da1a79ff2755e3e5785e73ce61f1f4f2ce095dcc585973f7b9b45db935 |
|
MD5 | 97aa620e4662cbf834fa9e4b752d0c08 |
|
BLAKE2b-256 | 78e8e58c4f1cff04d0d408fb8c6d7d2dc364e76d22d3fa2e73029028a106d54c |