Djangoの便利な外部モジュール django-configurations
Djangoの便利な外部モジュール django-configurations
2021年4月25日
Django の便利な外部モジュール django-configurations
Django は、Web アプリや Web サービスを実装するのに必要な機能が標準で揃っています。 しかし、利用すると便利な外部のモジュールもたくさんあります。 この記事では、Django の設定で使われる「settings.py」を管理するのに便利な外部モジュール「django-configurations」を紹介します。
開発用と公開用の設定は違う!
これまで、Django の基本的な使い方を中心に紹介してきました。 ここまでは、基本的に開発の為の設定を中心に書いています。開発の場合、開発用の Web サーバーを起動して機能の実装を進めていますが、実はこの設定はインターネットに公開する場合はいろいろ変更が必要になってきます。
理由は幾つかありますが、大きなものとしては:
- セキュリティ
- 性能
です。セキュリティに関しては、 開発用では、秘密鍵(secret key)が「settings.py」に書かれています。実際に公開する場合はこの秘密鍵は使用しないので、変更が必要です。
また、性能面では、開発用に起動している Web サーバーの機能は制限があります。開発の場合はアクセスは限定的で、基本的には開発者以外はアクセスしません。従って、Web サーバー自体はシンプルな物になっていますし、標準で利用しているデータベースも SQLite という簡易型のデータベースです。実際に公開する場合には、別の設定で公開するのが普通になっています。
詳しい、公開の手続きについては別途記事を書く予定ですが、今日はこうした設定の違いに対応する為の方法として、外部のモジュールを使う方法を紹介します。
これまで、Django の基本的な使い方を中心に紹介してきました。 ここまでは、基本的に開発の為の設定を中心に書いています。開発の場合、開発用の Web サーバーを起動して機能の実装を進めていますが、実はこの設定はインターネットに公開する場合はいろいろ変更が必要になってきます。
理由は幾つかありますが、大きなものとしては:
- セキュリティ
- 性能
です。セキュリティに関しては、 開発用では、秘密鍵(secret key)が「settings.py」に書かれています。実際に公開する場合はこの秘密鍵は使用しないので、変更が必要です。
また、性能面では、開発用に起動している Web サーバーの機能は制限があります。開発の場合はアクセスは限定的で、基本的には開発者以外はアクセスしません。従って、Web サーバー自体はシンプルな物になっていますし、標準で利用しているデータベースも SQLite という簡易型のデータベースです。実際に公開する場合には、別の設定で公開するのが普通になっています。
詳しい、公開の手続きについては別途記事を書く予定ですが、今日はこうした設定の違いに対応する為の方法として、外部のモジュールを使う方法を紹介します。
django-configurations
「django-configurations」は Django の外部モジュールで、設定の管理に利用できるモジュールです。 便利な点は、設定を Python のクラスで管理できるようにしているため、公開用の設定を行う際に、開発用の設定のクラスを継承した別のクラスを作成して、必要な設定のみ上書き(override)する事が可能になります。
こうすることで、設置のファイル「settings.py」を分ける事なく、開発用と公開用の共通の設定の変更もスムーズに行う仕組みにする事が可能になります。
使い方はシンプルで、まずはこの外部モジュールを「pip (pip3)」を使ってインストールします。 仮想環境になっていることを確認して以下のコマンドを実行してインストールします。
$ pip3 install django-configurations
その後で、「settings.py」を書き換えます。
必要な変更は以下の3点です:
- 「from configurations import Configuration」を追加
- 「class Development(Configuration):」を追加
- 全ての設定を作成したクラス「Devlopment」の中に移動
だけです。クラスの名前は例では「Development」にしていますが、なんでも構いません。
以下が書き換えの例になります。
from pathlib import Path
import os
from configurations import Configuration, values
class Development(Configuration):
""" 開発用の設定 """
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# この下に設定を追加
...
class Production(Development):
""" 公開用の設定 """
DEBUG = False
SECRET_KEY = values.SecretValue()
公開用の設定は、別のクラス、上の例では「Production」を作成して、「Development」を継承させます。特に指定しない設定は、開発用の設定をそのまま使って、それ以外の設定は開発用の設定を上書きして設定できるようになります。
「django-configurations」は Django の外部モジュールで、設定の管理に利用できるモジュールです。 便利な点は、設定を Python のクラスで管理できるようにしているため、公開用の設定を行う際に、開発用の設定のクラスを継承した別のクラスを作成して、必要な設定のみ上書き(override)する事が可能になります。
こうすることで、設置のファイル「settings.py」を分ける事なく、開発用と公開用の共通の設定の変更もスムーズに行う仕組みにする事が可能になります。
使い方はシンプルで、まずはこの外部モジュールを「pip (pip3)」を使ってインストールします。 仮想環境になっていることを確認して以下のコマンドを実行してインストールします。
$ pip3 install django-configurations
その後で、「settings.py」を書き換えます。
必要な変更は以下の3点です:
- 「from configurations import Configuration」を追加
- 「class Development(Configuration):」を追加
- 全ての設定を作成したクラス「Devlopment」の中に移動
だけです。クラスの名前は例では「Development」にしていますが、なんでも構いません。
以下が書き換えの例になります。
from pathlib import Path
import os
from configurations import Configuration, values
class Development(Configuration):
""" 開発用の設定 """
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# この下に設定を追加
...
class Production(Development):
""" 公開用の設定 """
DEBUG = False
SECRET_KEY = values.SecretValue()
公開用の設定は、別のクラス、上の例では「Production」を作成して、「Development」を継承させます。特に指定しない設定は、開発用の設定をそのまま使って、それ以外の設定は開発用の設定を上書きして設定できるようになります。
「manage.py」の変更も必要です!
django-configurations を利用する場合、settings.py の変更だけでなく、「manage.py」の変更も必要になります。これをしないと、開発時などの場合は、開発用のサーバーを起動しようとするとエラーになります。これは、Django の設定がデフォルトの設定とは違うため、設定を見つけられない為です。
変更の例です。
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'utility.settings')
os.environ.setdefault('DJANGO_CONFIGURATION', 'Development')
try:
from configurations.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
変更点は、2箇所です:
- 「os.environ.setdefault('DJANGO_CONFIGURATION', 'Development')」の追加
- execute_from_command_line のインポートのモジュールを「from configurations.management import execute_from_command_line」に置き換え
これでエラーなく、開発用のサーバーが起動できるようになります。
django-configurations を利用する場合、settings.py の変更だけでなく、「manage.py」の変更も必要になります。これをしないと、開発時などの場合は、開発用のサーバーを起動しようとするとエラーになります。これは、Django の設定がデフォルトの設定とは違うため、設定を見つけられない為です。
変更の例です。
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'utility.settings')
os.environ.setdefault('DJANGO_CONFIGURATION', 'Development')
try:
from configurations.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
変更点は、2箇所です:
- 「os.environ.setdefault('DJANGO_CONFIGURATION', 'Development')」の追加
- execute_from_command_line のインポートのモジュールを「from configurations.management import execute_from_command_line」に置き換え
これでエラーなく、開発用のサーバーが起動できるようになります。
何が便利か?
最初にも書いていますが、開発用と公開用の設定の管理が効率よく行えるようになります。
便利な点は:
- 共通の設定は、開発用の設定を変更すると公開用の設定も変更されるので、1箇所の変更で済むようになります
- 公開時に必要な設定のみを、公開用の設定のクラスで変更すれば良い。
公開時に変更するものは公開関連の記事を書く際に詳細を紹介する予定です。例としては簡易的なデータベースの SQLite からデータベースを MySQL や PostgreSQL などの本格的なデータベースに変更する事や、秘密鍵の設定などが必要になります。
これらの変更に対応するために、標準のやり方だと、開発用の設定をコメントアウトして公開用の設定に変更するか、別のファイルを作成して置き換える必要があります。 どちらも、開発用と公開用の入れ替えが面倒ですが、この方法だと設定のクラスの指定を変えるだけで対応できるので、スムーズに行えます。
最初にも書いていますが、開発用と公開用の設定の管理が効率よく行えるようになります。
便利な点は:
- 共通の設定は、開発用の設定を変更すると公開用の設定も変更されるので、1箇所の変更で済むようになります
- 公開時に必要な設定のみを、公開用の設定のクラスで変更すれば良い。
公開時に変更するものは公開関連の記事を書く際に詳細を紹介する予定です。例としては簡易的なデータベースの SQLite からデータベースを MySQL や PostgreSQL などの本格的なデータベースに変更する事や、秘密鍵の設定などが必要になります。
これらの変更に対応するために、標準のやり方だと、開発用の設定をコメントアウトして公開用の設定に変更するか、別のファイルを作成して置き換える必要があります。 どちらも、開発用と公開用の入れ替えが面倒ですが、この方法だと設定のクラスの指定を変えるだけで対応できるので、スムーズに行えます。
まとめ
Django は、Web アプリや Web サービスで利用する機能が揃っている点が大きな魅力でもあります。しかし、さらに便利で使いやすい環境を利用することも可能です。外部のモジュールを導入することで、より使いやすく便利な環境で開発できます。
この記事では、「django-configurations」を利用することで、開発用と公開用の設定の違いを効率よく管理することが可能になる例を紹介しました。
他にも便利な外部モジュールがありますので、別の記事で紹介していく予定です。
Django は、Web アプリや Web サービスで利用する機能が揃っている点が大きな魅力でもあります。しかし、さらに便利で使いやすい環境を利用することも可能です。外部のモジュールを導入することで、より使いやすく便利な環境で開発できます。
この記事では、「django-configurations」を利用することで、開発用と公開用の設定の違いを効率よく管理することが可能になる例を紹介しました。
他にも便利な外部モジュールがありますので、別の記事で紹介していく予定です。
コメント
コメントを投稿