1|2Pythonオブジェクトを利用した構成Pythonオブジェクトを利用した構成といっても、基本はファイルを利用した場合と同様だ。from_objectメソッドに.pyファイルを渡すだけだ。こちらではPythonのモジュールやクラスを渡すことができる。Production」に掲載されているコードを改変したもの)。config.py"基底クラスで基本構成を、派生クラスで環境ごとの構成を行う例(config.pyファイル)モジュールトップレベルと各クラスでSOME_CONFIGを定義している。構成の基底クラスとなるConfigクラスとプロダクション構成を示すProductionConfigクラスではDATABASE_URIが異なる値になっている。このような構成にすることで、デフォルトの構成/環境ごとの構成を切り分けられる(が、読み込む構成は以下に示すようにハードコードすることになるのであまり意味はないかもしれない)。これらの構成をアプリで読み込むには以下のようにする(ここではfrom_pyfileなどのメソッド呼び出しは削除した)。config=app.config.items())configモジュールで定義したDevelopmentConfigクラスを使用して構成を行うコード(__init__.pyファイル)from_objectメソッドには上のコード例のように「パッケージ.モジュール.クラス名」あるいは「モジュール.クラス名」といった形式で利用するクラスやモジュールを文字列形式で渡せる。次のようにクラスオブジェクトを渡してもよい。実行結果を以下に示す。DevelopmentConfigクラスで定義されている構成値が表示されたところ(最下部)最下部の2行を見ると、DATABASE_URIの値は基底クラスのものが使われ、SOME_CONFIGの値はDevelopmentConfigクラスで定義したものが使われている。上のコードを見ても分かるように、これでは構成をアプリ内にハードコードすることになってしまうことには注意しよう。実際、from_objectメソッドのドキュメントでは「デフォルトの構成ではなく、実際に使用する構成を読み込むのにこの関数を使うべきではない。実際に使用する構成はfrom_pyfileメソッドを使って、理想をいえば、アプリのパッケージとは異なる場所から読み込むべき」とある(筆者による意訳)。そのため、from_objectメソッドを使用する場合の理想形は、(今のところ)以下のようなコードになる。config=app.config.items())デフォルト値をfrom_objectで読み込み、from_pyfileで環境固有の構成値を読み込む上のコードで行っている「app.config.from_pyfile(os.environ["APP_SETTINGS"])」はコメントアウトしてある「app.config.from_envvar("APP_SETTINGS")」と同値だ。環境変数APP_SETTINGSで「アプリ本体(パッケージ)とは異なるフォルダ」にあるファイルを指定することで、(特に機密性のある)構成ファイルをアプリから分離できるようになる。これを簡単に行うための機構が最後に紹介する構成方法である「インスタンスフォルダ」だ。APIへのアクセスに必要なキー、クッキーの署名に必要となるシークレットキーなど)を保存するための場所として想定されており、このフォルダはソース管理の対象から外すものとされている。環境固有の設定値などもこのフォルダに置くことが推奨されている。インスタンスフォルダを指定するには、Flaskクラスのコンストラクタでアプリインスタンスを初期化する際に、そのフルパスを指定するか、instance_relative_configスイッチをTrueに設定する。ここでは後者の方法でインスタンスフォルダを使ってみよう。config=app.config.items())インスタンスフォルダを使用するように修正したコード(__init__.pyファイル)上のコードでは、Flaskクラスのコンストラクタでinstance_relative_configスイッチをTrueにしている。この場合、パッケージと同レベルにある「instance」フォルダが「インスタンスフォルダ」として扱われる。そこで、このフォルダを作成して、そこにconfig.cfgファイルを置いてみる。最終的なフォルダ構成config.cfgファイルの内容は以下のようにしておこう。「app.config.from_object(......)」で読み込むデフォルト構成を記述したファイル(config.pyファイル)は、これまで通り、アプリのパッケージ内に置いておけばよい。実行結果を以下に示す。instance/config.cfg」となっていることから、この値がinstance/config.cfgファイルから読み込まれたことが分かる。その一方で、DATABASE_URIの値はflask_appパッケージ内にあるconfig.pyファイルのConfigクラスで定義されたものとなっている。Production」では以下のような事項が推奨されているので、興味のある方はドキュメントにも目を通しておこう(プロダクションレベルのコードや構成をプッシュする方法についても推奨事項があるが、ここでは割愛)。デフォルト構成はバージョン管理の下に置く構成の切り替えには環境変数を使用する。Pythonコードの外部でこれを行うことで、構成の切り替えを簡単に、コードに手を付けることなく行えるこのポリシーに従い、環境変数とfrom_envvarメソッドを利用して、インスタンスフォルダ内にある各種環境用の構成を切り替えるようにすることで、安全かつ柔軟性を持った形でFlaskアプリの構成を行えるようになるはずだ。今回はFlaskアプリの構成をどのように行えばよいかを見てきた。Flaskアプリの構成については「Flaskにおける設定ファイルのベストプラクティス」と「explore-flask-ja/configuration.md」も参考になるので、ぜひ参考にしてほしい。次回はFlaskアプリのデプロイについて見ていく予定だ。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。