app.config["API_key"] と current_app["API_Key"]を活用
1. アプリ全体で API Keyを使えるようにする
- Flaskの g に APIキー のようなアプリ全体で利用される情報を保存することは推奨されない。
- g はリクエストごとにスレッド固有のデータを一時的に格納するためのものであり、APIキーのようなグローバルな設定を格納する用途には適していない
- APIキーは、環境変数や設定ファイル (.env, config.py など) で管理し、アプリケーションが起動した際に一度ロードして使用するのが一般的
- .envを使う方がベストプラクティスとして標準的な手法なっている
- 環境変数にすることで、APIキーなどの機密情報をソースコードから分離することで、誤って公開してしまうリスクを大幅に減らすメリットがある
- クラウドプロバイダーが提供する シークレット管理サービス(例:AWS Secrets ManagerやGoogle Cloud Secret Manager)を使用するもある
- Flaskの app.config は、アプリケーション全体で設定値を管理するための辞書のような構造を持ったオブジェクト
- Flaskアプリケーションの設定に関わるパラメータ(デバッグモードのオン・オフ、データベース接続設定、APIキーなど)を保存し、アプリ全体から参照することができる
設定例 1
- load_dotenv で.envを環境変数として読み込む
- os.getenv()でapi_keyを読み込み、変数API_keyとして定義
- app.config["API_key"]として
.env
api_key1="43785f92e7mshf1"
api_key2="AIzaSyD574tn5m7"
app.py
import os
from dotenv import load_dotenv
from flask import Flask
app = Flask(__name__)
load_dotenv()
app.config["API_key1"] = os.getenv("api_key1")
app.config["API_key2"] = os.getenv("api_key2")
function.py
from flask import current_app
API_Key1 = app.config["API_key1"]
API_Key2 = app.config["API_key2"]
設定例 2 (Blueprintが採用されている場合)
- app が設定されないないため、function.pyに app.config["API_key"]を使えない
- load_dotenv で.envを環境変数として読み込む
- os.getenv()でapi_keyを読み込み、変数API_keyとして定義
- Blueprintが採用されている場合、app.config["API_key"]が使えないため、代わりにcurrent_app["API_key"]を使う
.env (BP)
api_key1="43785f92e7mshf1"
api_key2="AIzaSyD574tn5m7"
app.py (BP)
import os
from dotenv import load_dotenv
from flask import Flask, current_app
app = Flask(__name__)
load_dotenv()
app.config["API_key1"] = os.getenv("api_key1")
app.config["API_key2"] = os.getenv("api_key2")
function.py (BP)
from flask import Blueprint, current_app
API_Key1 = current_app["API_key1"]
API_Key2 = current_app["API_key2"]
まとめ
- Blueprintを使っている場合でも、.env に保存された環境変数を load_dotenv を使ってFlaskの app.config に読み込み、Blueprint内では current_app を使って参照すれば、環境変数(APIキーなど)を安全かつ簡単に利用できる