Python YAML設定からENV変数への変換
Pythonアプリケーション(Django、Flask、FastAPI)のYAML設定を環境変数に変換します。django-environパターンとpython-dotenvの互換性を解説します。
詳細な説明
Pythonウェブフレームワークは、開発時にはYAMLを、本番環境では環境変数を設定に使用するのが一般的です。これらの間の変換には、フレームワーク固有の規約とPythonの型変換パターンの理解が必要です。
Django settings.yml(PyYAMLで読み込み):
django:
secret_key: "django-insecure-dev-key-change-me"
debug: true
allowed_hosts:
- localhost
- 127.0.0.1
- ".example.com"
database:
engine: django.db.backends.postgresql
name: myproject
user: postgres
password: localpass
host: localhost
port: 5432
cache:
backend: django.core.cache.backends.redis.RedisCache
location: "redis://localhost:6379/1"
email:
backend: django.core.mail.backends.smtp.EmailBackend
host: smtp.gmail.com
port: 587
use_tls: true
host_user: "user@example.com"
host_password: "app-password"
対応する.envファイル(django-environ用):
# Django core
DJANGO_SECRET_KEY=django-insecure-dev-key-change-me
DJANGO_DEBUG=True
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1,.example.com
# Database(django-environはDATABASE_URLパターンを使用)
DATABASE_URL=postgres://postgres:localpass@localhost:5432/myproject
# Cache(django-environ URLパターン)
CACHE_URL=redis://localhost:6379/1
# Email
EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USE_TLS=True
EMAIL_HOST_USER=user@example.com
EMAIL_HOST_PASSWORD=app-password
Python固有の変換における注意点:
django-environのURLパターン。 個別の
host、port、user、password、nameキーの代わりに、django-environは単一のURLを使用します:DATABASE_URL=postgres://user:pass@host:port/dbname。これはよりコンパクトですが、粒度が失われます。ブール値の規約。 Pythonの
True/Falseの大文字表記は、Python向けのENVファイルでよく使用されます(他のエコシステムでの小文字true/falseとは異なる)。django-environライブラリはどちらも受け入れます。リストの処理。
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1はenv.list('DJANGO_ALLOWED_HOSTS')でカンマ区切りでパースされます。django-environによる型キャスト:
import environ
env = environ.Env(
DEBUG=(bool, False), # boolにキャスト、デフォルトFalse
EMAIL_PORT=(int, 587), # intにキャスト、デフォルト587
ALLOWED_HOSTS=(list, []), # listにキャスト、デフォルト空
)
Flask/FastAPI対応:
# Flask config.yml
flask:
secret_key: dev-key
sqlalchemy_database_uri: "sqlite:///app.db"
max_content_length: 16777216
FLASK_SECRET_KEY=dev-key
SQLALCHEMY_DATABASE_URI=sqlite:///app.db
MAX_CONTENT_LENGTH=16777216
主なパターン: Pythonフレームワークは通常、YAMLキー階層にプレフィックスを除外してマッチするUPPER_SNAKE_CASEのENV変数名を期待します(例:django.secret_key -> DJANGO_SECRET_KEYまたは単にSECRET_KEY)。
ユースケース
Heroku、Render、Railwayなどのプラットフォームへのデプロイのために、データベースURL用のdjango-environパターンとシークレット管理を使用して、開発用YAML設定を環境変数に変換してDjangoアプリケーションを準備する場合。