pythonでスクリプトに埋め込みたくない情報を外部から読み込む(dotenv)
これまで、でんき家計簿やガス料金の情報をスクレイピングしてgoogle spreadsheetに入力してみたがスクレイピングに必要となる情報やgoogle spreadsheetにアクセスするための情報はセキュリティ上pythonスクリプトに埋め込むのも良くないし他の人が使う場合の汎用性が低い。
そこでdotenvを使ってファイルに用意した各種情報を環境変数に設定しそれを読み込んで使用するようにした。
dotenvは
pip install python-dotenv
でインストールが必要。
settings_kokyo.py
settings_kokyo.py として以下のスクリプトを作成。これはこのpythonスクリプトと同じディレクトリにある .env.koukyo というファイルから環境変数に読み込む処理を行う。(※ 今回のエッセンスに注記あり)
import os
from os.path import join, dirname
from dotenv import load_dotenv
load_dotenv(verbose=True)
dotenv_path = join(dirname(__file__), '.env.koukyo')
load_dotenv(dotenv_path)
.env.koukyo
.env.koukyoには以下の情報が記載されている。この変数を環境に応じて変更しておく。
SPREADSHEET_KEY='XXXXXXXXXXXXXX'
TARGET_WORKSHEET="test_koukyo97"
CREDENTIAL_JSON='/pass/to/python-spreadsheet-xxxx.json'
# でんき家計簿
DENKI_USER_ID='xxxxxxxx'
DENKI_PASSWORD='xxxxxxxx'
# 東京ガス
GAS_USER_ID='xxxxxxxx'
GAS_PASSWORD='xxxxxxxx'
GAS_CUSTOMER_ID='xxxxxxxx'
# 横浜市水道局
WATER_USER_ID='xxxxxxxx'
WATER_PASSWORD='xxxxxxxx'
sample.py
sample.py では settings_kokyo.py をモジュールとして読み込むことで.env.koukyoに記載されている情報が環境変数にセットされるため、os.environ.get()を用いてそれぞれのキーの環境変数の値を取り出している。
import os
import settings_kokyo
# Google Spreadsheet
SPREADSHEET_KEY = os.environ.get("SPREADSHEET_KEY")
TARGET_WORKSHEET = os.environ.get("TARGET_WORKSHEET")
CREDENTIAL_JSON = os.environ.get("CREDENTIAL_JSON")
# でんき家計簿
DENKI_USER_ID = os.environ.get("DENKI_USER_ID")
DENKI_PASSWORD = os.environ.get("DENKI_PASSWORD")
# 東京ガス
GAS_USER_ID = os.environ.get("GAS_USER_ID")
GAS_PASSWORD = os.environ.get("GAS_PASSWORD")
GAS_CUSTOMER_ID = os.environ.get("GAS_CUSTOMER_ID")
# 横浜市水道局
WATER_USER_ID = os.environ.get("WATER_USER_ID")
WATER_PASSWORD = os.environ.get("WATER_PASSWORD")
今回のエッセンス
スクリプトに埋め込みたくない情報はdotenvモジュールを使うことで扱うことができる。
なお、.env.koukyo に記載したファイルをわざわざ環境変数に読み込んで使っているので、それなら単純にpythonスクリプトを作ってモジュールとしてimportして使ってしまえば良いのではないかと考えてしまうと思うが、環境変数からパラメータを読み出せるようにしておけば、HerokuのようなPaaSを使う場合に個別に環境変数を設定してそれを読み込んで使うというようなことが出来る。
また、本来は.env.koukyoはスクリプトとは別の場所に置いておくべきで、httpサーバーのhtdocs以下のような外部から直接アクセス可能な場所に置いておくべきものではないので実際に運用する場合は注意が必要。