業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【Hakkyの社内Wiki】Strapi
AI

執筆者:Handbook編集部

Setting Managementとは

pydantic の SettingManagement とは?

何かしらのアプリケーションを作る際、mode の切替や接続先の url など、いわゆる設定値を管理する機能があると便利です。

pydantic は主要な機能として Setting Management(設定管理)があります。本文書を読んで pydantic の Setting Management の作り方や仕組みを覚えていきましょう。

この文書はどんなことがわかるか?

  • 設定用のモデルが通常のクラスで作るよりどんな点で優れているのか知ることができる
  • pydantic を使った基本的な設定用のモデルの作り方を知ることができる
  • 環境変数をはじめとした外部の値を設定用のモデルに読み込ませる方法を知ることができる

どんな点で pydantic の SettingManageMent が通常のクラスで管理するよりも優れているのか?

設定値を管理するクラス自体は pydantic を用いずに通常のクラス宣言で作ることは可能ですが、pydantic を用いた場合以下の点で通常のクラスより優れている面があります。

  • モデルとして作るためフィールド値を型で管理することができる
  • フィールド値に対して型ヒントを使うことができる
  • 環境変数で設定した値を自動的に読み込むことができる

使い方

それでは pydantic の設定管理を行うモデルの作り方と外部の値をどのやって読み込むのか見ていきましょう。

BaseSetting を継承した設定管理を行う基本的なモデルの作り方

pydantic で設定値を管理するモデルを作成する場合、BaseSettingsというクラスを継承して作成します。

基本的な作成方法はモデルの作成と同様になります。

下記コード例は非常に単純な設定管理の例となります。

from pydantic import BaseSettings


class Settings(BaseSettings):   # BaseSettingsを継承する
    num: int = 0

    class Config:
        pass


print(Settings().dict())        # デフォルト値を使う場合

print(Settings(num=1).dict())   # 値を初期化する場合

上記を実行すると、結果は下記のようになります。

{'num': 0}
{'num': 1}

環境変数から値を読み込む方法

pydantic の設定管理モデルには環境変数を読み込む機能がございます。

方法としては以下の二通りがあります。

  1. フィールドの初期値に Field(..., env="環境変数名")を設定する
  2. Config.fields['field_name']['env'] に設定する

具体的な設定方法は下記コードをご覧ください。下記コードでは外部から auth_key, api_key を環境変数で設定した例となります。

from pydantic import BaseModel, BaseSettings, RedisDsn, Field


class SubModel(BaseModel):
    foo = "bar"
    apple = 1


class Settings(BaseSettings):
    auth_key: str
    api_key: str = Field(..., env="my_api_key")  # my_api_keyという環境変数名で取得します。

    redis_dsn: RedisDsn = "redis://user:pass@localhost:6379/1"

    # SubModelから設定をオーバーライドします
    # export my_prefix_more_settings='{"foo": "x", "apple": 1}'
    more_settings: SubModel = SubModel()

    class Config:
        env_prefix = "my_prefix_"  # 環境変数に付けるデフォルトのプレフィックスを設定します。
        fields = {
            "auth_key": {
                "env": "my_auth_key",  # auth_keyはmy_auth_keyという環境変数名で取得します。
            },
            "redis_dsn": {"env": ["service_redis_dsn", "redis_url"]},
        }


print(Settings().dict())

上記を実行する前に、下記環境変数を設定する必要があります。

something-value は任意の値で良いので、設定してください。

export my_api_key="something-value"
export my_auth_key="something-value"

設定後にコードを実行すると、結果は下記のようになります。(my_api_key="abc", my_auth_key="xyz"を設定した状態で実行)

{'auth_key': 'abc', 'api_key': 'xyz', 'redis_dsn': RedisDsn('redis://user:pass@localhost:6379/1', scheme='redis', user='user', password='pass', host='localhost', host_type='int_domain', port='6379', path='/1'), 'more_settings': {'foo': 'bar', 'apple': 1}}

.env ファイルから値を読み込む方法

note
warn

pydantic で.env ファイルを扱う場合、python-dotenvパッケージが必要になります。下記のどちらかの方法でインストールしてください。

  • pip install python-dotenv
  • pip install pydantic[dotenv]

.env ファイルはプラットフォームに依存しない環境変数を扱う一般的なパターンです。pydantic では.env ファイルで設定した値を読み込むことができます。

pydantic は次の二つの方法で.env ファイルからの読み込みをサポートしています。

1

クラスの Config に env_file(OS のデフォルトエンコーディングが不要な場合は env_file_encoding も)を設定するやり方

class Settings(BaseSettings):
    ...

    class Config:
        env_file = '.env'
        env_file_encoding = 'utf-8'

2:キーワード引数 _env_file (および必要に応じて _env_file_encoding) を持つ BaseSettings 派生クラスのインスタンスを作成するやり方。

settings = Settings(_env_file='prod.env', _env_file_encoding='utf-8')

env_file(もしくは_env_file)に設定する値は有効なパスかファイル名であれば機能します。

下記コード例は.env,prod.env に設定した URL がどのように設定されているかを確認しております。

from pydantic import BaseSettings


class Settings(BaseSettings):
    url: str  # envのキーと合わせる必要があります。

    class Config:
        case_sensitive = False  # 大文字小文字問わず(デフォルトでFalseになので本来は不要)
        env_file = ".env"
        env_file_encoding = "utf-8"


print(Settings().dict())

print(Settings(_env_file="prod.env", _env_file_encoding="utf-8").dict())

確認のため、同じ階層に次のファイルをあらかじめ用意しております。

.env

URL="hogehoge.com"

prod.env

URL="fugafuga.com"

上記を実行すると、結果は下記のようになります。

{'url': 'hogehoge.com'}
{'url': 'fugafuga.com'}

シークレットファイルから値を読み込む方法

ファイルに秘密の値を配置することは、アプリケーションに機密設定を提供するためによく用いられるパターンです。

シークレットファイルは、単一の値のみを含み、ファイル名がキーとして使用されることを除けば、dotenv ファイルと同じように設定することができます。

下記コード例では同じ階層にsecret_passwordという機密ファイルを置いた状態で値が読み込めるが確認しております。

from pydantic import BaseSettings


class Settings(BaseSettings):
    secret_password: str  # 機密ファイル名と合わせる

    class Config:
        secrets_dir = "."  # 機密ファイルがあるパスを設定する


print(Settings().dict())

上記を実行すると、結果は下記のようになります。

{'secret_password': 'super_secret_database_password'}

値を読み込む優先度について

ここまでさまざまな値を読み込む方法を紹介しましたが、読み込む値については下記の通り優先度がありますのでご注意ください。

  1. Setting モデルのイニシャライザーに渡される引数
  2. 環境変数
  3. .env から読み込まれた変数
  4. secret ディレクトリから読み込まれた変数
  5. Setting モデルにデフォルトで設定されたフィールド値

参考

info
備考

Hakky ではエンジニアを募集中です!まずは話してみたいなどでも構いませんので、ぜひお気軽に採用ページからお問い合わせくださいませ。

2025年06月02日に最終更新
読み込み中...