LoginSignup
0
0

More than 5 years have passed since last update.

openshiftに対応するためのDjango2コーディング時に気を付けるべき点

Last updated at Posted at 2019-01-08

いままでのおさらい

前回まででnginx+gunicorn+Django2をminishiftで動作させることには成功しました。
ここでOpenShift上で特に気を付けるべきDjango2プロジェクトの書き方に触れておきたいと思います。

それはずばり「OpenShift側で設定した環境変数をsettings.pyに取り込む!」です。

これをしておくとイチイチ、ソースを修正することなく環境変数の設定変更&リビルドで行けちゃいます。

環境変数の参照方法

Django2でのOS環境変数の取得方法はos.getenvですね。

import os
os.getenv('<環境変数名>','<デフォルト値>')

実際にsettings.pyに使ってみる

実際に利用するシーンとしてはSECRET_KEYDEBUGALLOWED_HOSTSDATABASESLANGUAGE_CODETIME_ZONE、あとはメール送信の設定などでしょうか

SECRET_KEYを環境変数から設定する

元コード

settings.py
SECRET_KEY = 'g*jrfy&_%p3y0-_bgilt)e(dsy9^hag2(kc3%b1u9hn****kh3'

環境変数対応版

settings.py
SECRET_KEY = os.getenv(
    'DJANGO_SECRET_KEY',
    # safe value used for development when DJANGO_SECRET_KEY might not be set
    'g*jrfy&_%p3y0-_bgilt)e(dsy9^hag2(kc3%b1u9hn****kh3'
)

ALLOWED_HOSTSを環境変数から設定する

ある時期は限定したIPからのアクセスに絞って、OKなら全体に公開する的な使い方もできますね。

元コード

settings.py
ALLOWED_HOSTS = ['*']

環境変数対応版

settings.py
ALLOWED_HOSTS = [os.getenv('DJANGO_ALLOWED_HOSTS','*')]

DATABASESを環境変数から設定する

同様にDBの設定についても可変にできるといいですね。ちょっとだけ複雑になりますが

元コード

settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'database_name',
        'USER': 'user_name',
        'PASSWORD': 'password',
        'HOST': 'xxx.xxx.xxx.xxx',
        'PORT': '5432',
    }
}

環境変数対応版

settings.py
engines = {
    'sqlite': 'django.db.backends.sqlite3',
    'sqlite3': 'django.db.backends.sqlite3',
    'postgresql': 'django.db.backends.postgresql',
    'mysql': 'django.db.backends.mysql',
    'oracle': 'django.db.backends.oracle',
}

engine = engines.get(os.getenv('DATABASE_ENGINE'), engines['sqlite'])

if engine == engines['sqlite']:
    DATABASES = {
        'default': {
            'ENGINE': engine,
            'NAME': os.path.join(BASE_DIR, os.getenv('DATABASE_NAME','db.sqlite3')),
        }
    }
else:
    service_name = os.getenv('DATABASE_SERVICE_NAME', '').upper().replace('-', '_')

    DATABASES = {
        'default': {
            'ENGINE': engine,
            'NAME': os.getenv('DATABASE_NAME'),
            'USER': os.getenv('DATABASE_USER'),
            'PASSWORD': os.getenv('DATABASE_PASSWORD'),
            'HOST': os.getenv('{}_SERVICE_HOST'.format(service_name)),
            'PORT': os.getenv('{}_SERVICE_PORT'.format(service_name)),
        }
    }

もちろん参照する環境変数はDeployConfigの中にenvに定義しておいてください。
その際に気を付けるべき点としては、変数名がすべて大文字になり、-があると_に置き換わることです。
なのでこのコードなんですよね。

service_name = os.getenv('DATABASE_SERVICE_NAME', '').upper().replace('-', '_')

一部はDeploy時にOpenShistが自動で値を定義するものもあります。
例えばDB設定の例の<NAME>_SERVICE_HOST<NAME>_SERVICE_PORTなどはそれに当たります。

何が環境変数にセットされているか確認するには、s2iスクリプトのrunsetコマンドでも入れてデバックすると良いでしょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0