Skip to content

Commit

Permalink
Change default connection to database to use host different than dock…
Browse files Browse the repository at this point in the history
…er container

- After setting up the virtual environment for the project
  (note missing instruction how to work locally with venv in `Readme.md`) and
  after running the `makemigrations --dry-run` or starting the webserver,
  application is trying to connect with hardcoded hostname `db` used from Dockerfile
- This patch allows to add multiple hostname from environment variable `DJANGO_ALLOWED_HOSTS` separated
  by delimiter (I liked `,`) and since the create type in settings.py is `list` type
  it is free to use first value from a list if/when needed.
- Add `get()` method for `os.environ` which is returning `None` instead of `KeyError` and validate parameters that we need.
  Using this approach only `$ export DJANGO_DB_HOST DJANGO_USER_NAME DJANGO_USER_NAME_PASSWOR` is needed.
- Update `docker/.env` with new added environment variable `DJANGO_DB_HOST`
- Proof
* No patch
```
$ export DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1
$ ./manage.py makemigrations --dry-run
/home/anel/mariadb/feedback-plugin-backend/env/lib/python3.8/site-packages/django/core/management/commands/makemigrations.py:105:
  RuntimeWarning: Got an error checking a consistent migration history performed for database connection 'default': (2005, "Unknown MySQL server host 'db' (-3)")
  warnings.warn(
Migrations for 'feedback_plugin':
  feedback_plugin/migrations/0002_alter_rawdata_upload_time.py
    - Alter field upload_time on rawdata
```
* With patch
```
$ ./manage.py makemigrations --dry-run
Migrations for 'feedback_plugin':
  feedback_plugin/migrations/0002_alter_rawdata_upload_time.py
    - Alter field upload_time on rawdata
```
- Also server gets started correctly
```
$ ./manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 19 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, feedback_plugin, sessions.
Run 'python manage.py migrate' to apply them.
May 30, 2022 - 14:51:50
Django version 3.2.13, using settings 'feedback_plugin.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```
  • Loading branch information
an3l committed May 31, 2022
1 parent 7118c68 commit d6c14b2
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 8 deletions.
1 change: 1 addition & 0 deletions docker/.env
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ DJANGO_DEBUG=True
#
# There will also be a test_{DJANGO_DB_NAME} database used for running tests.
DJANGO_DB_NAME='feedback_plugin'
DJANGO_DB_HOST='db'
DJANGO_DB_USER_NAME='feedback'
DJANGO_DB_USER_PASSWORD='A;p4rqgDt-Mf7L{z'

Expand Down
25 changes: 17 additions & 8 deletions src/feedback_plugin/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,23 @@
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = bool(os.environ['DJANGO_DEBUG'])
DEBUG = bool(os.environ.get('DJANGO_DEBUG'))
if DEBUG == None:
DEBUG = True

ALLOWED_HOSTS = [os.environ['DJANGO_ALLOWED_HOSTS']]
if os.environ.get('DJANGO_ALLOWED_HOSTS'):
ALLOWED_HOSTS = os.environ['DJANGO_ALLOWED_HOSTS'].split(',')
# DB_HOST default means localhost, instead one should set the unix socket and/or other host
DB_HOST = os.environ.get('DJANGO_DB_HOST')
if DB_HOST == None:
DB_HOST = ''

LOG_LEVEL = os.environ.get('DJANGO_LOG_LEVEL')
if LOG_LEVEL == None:
LOG_LEVEL = 'ERROR'

# Application definition

Expand Down Expand Up @@ -72,14 +82,13 @@

WSGI_APPLICATION = 'feedback_plugin.wsgi.application'


DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': os.environ['DJANGO_DB_NAME'],
'NAME': os.environ.get('DJANGO_DB_NAME'),
'USER': os.environ['DJANGO_DB_USER_NAME'],
'PASSWORD': os.environ['DJANGO_DB_USER_PASSWORD'],
'HOST': 'db',
'HOST': DB_HOST,
'OPTIONS': {'charset': 'utf8',
'use_unicode': True},
'TEST': {
Expand Down Expand Up @@ -150,12 +159,12 @@
'loggers': {
'django': {
'handlers': ['console'],
'level': os.environ['DJANGO_LOG_LEVEL'],
'level': LOG_LEVEL,
'propagate': False,
},
'views': {
'handlers': ['console'],
'level': os.environ['DJANGO_LOG_LEVEL'],
'level': LOG_LEVEL,
'propagate': False,
},
},
Expand Down

0 comments on commit d6c14b2

Please sign in to comment.