Flask開発効率UP!configファイルで環境変数を管理する方法

この記事の目標

Flaskでは、configファイルに環境設定を書いて、アプリの運用を分けることができます。例えば、本番環境では、本番環境用のデータベースを使い、開発環境では開発環境用のサーバーを使いたいとします。そんな時、いちいち設定ファイルのソースコードをエディタで変更するのは面倒です。

こんな時のために、Flaskでは、はじめから本番環境と開発環境の設定を別々に読み込む仕組みがあります。本番環境では本番環境用のファイルを読み込み、開発環境では開発環境用のファイルを読み込みます。

それでは、環境設定ファイルの読み込みを、解説していきましょう!

Flaskにおけるconfigファイルの役割

configファイルの役割

Flaskのconfigファイルは、アプリケーションの設定を記述するファイルです。データベースの接続情報、デバッグモードの有無など、アプリケーションの動作に影響を与える設定を記述します。開発環境、ステージング環境、本番環境など、環境ごとに異なる設定をファイルに記述すれば、読み込み先を変えることで、環境を簡単に切り替えることができます。こうすれば、いちいち設定を書き換えるよりも、コードの可読性が向上しますし、運用もしやすいですよね。

開発環境と本番環境の違い

では、開発環境と本番環境の違いは何でしょうか?それはアプリが起動する場面の違いです。

開発環境 (development mode)
開発環境は、アプリケーションの開発、テストを行うための環境です。
アプリを組み上げて、動作のチェックをする段階なので、セキュリティ設定が緩くなっていることが多いです。特徴としては、デバッグモードが有効になっており、データベースはローカル環境のものを使用することが多いことが挙げられます。

本番環境 (production mode)

一般ユーザーにサービスを提供するための環境です。実際にアプリケーションを公開し、ユーザーに使ってもらう環境のことです。特徴は、デバッグモードが無効になっており、データベースは本番環境、セキュリティ設定が厳しくされていることが挙げられます。

configファイルに記述するもの

configファイルに記述する主な内容にはどんなものがあるでしょうか?以下のようなものが挙げられます。

  • データベースの設定:
    • データベースの種類 (SQLAlchemyのURL形式で指定)
    • ユーザー名
    • パスワード
    • ホスト名
    • データベース名
  • デバッグモード:
    • デバッグモードの有効/無効
    • エラー発生時の詳細表示
    • 自動再ロード
  • SECRET_KEY:
    • セッションデータを暗号化するための鍵
  • その他の設定:
    • ログの設定
    • メールサーバーの設定
    • キャッシュの設定
    • テンプレートの設定
    • その他、アプリケーション固有の設定 など

それでは、コードを使って、configファイルを書いてみましょう!

クラスでconfigファイルを書く

configファイルの設定方法には2通りあります。

1つは、Pythonファイルにクラスを書き、クラスの中に設定を書く方法です。
もう1つは、cfgファイルに記述する方法です。

それでは、クラスに書く方法から説明します。

クラスに設定を書く方法

Flaskアプリのファイル構成はこのようになっています。flaskr/conf に settings.py があります。ここに、クラスで設定を書きます。

settings.pyの中身です。

import os

class DevelopmentConfig:
    basedir = os.path.abspath(os.path.dirname(__name__))
    SECRET_KEY='mysite'
    SQLALCHEMY_DATABASE_URI='sqlite:///' + os.path.join(basedir, 'data.sqlite')
    SQLALCHEMY_TRACK_MODIFICATIONS=False
    ENV='development'


class ProductionConfig:
    basedir = os.path.abspath(os.path.dirname(__name__))
    SECRET_KEY='mysite'
    SQLALCHEMY_DATABASE_URI='sqlite:///' + os.path.join(basedir, 'data.sqlite')
    SQLALCHEMY_TRACK_MODIFICATIONS=False
    ENV='production'

このように、データベース設定やシークレットキーの設定を書いています。

クラスに書いたconfigファイルを読み込む

settings.pyファイルの読み込みは、__init__.pyが行います。具体的には、create_app関数の中に、環境設定ファイルの読み込み方法を書いています。以下のコードは、__init__.pyです。

import os
from flask import Flask
from .config.settings import DevelopmentConfig, ProductionConfig

config_class = {
    'development': DevelopmentConfig,
    'production': ProductionConfig
}

def create_app():
    app = Flask(__name__)
    config_target = config_class[os.getenv('ENVIRONMENT', 'development')]
    app.config.from_object(config_target)
    return app

cfgファイルでconfigを書く

もう一つ、環境設定を記述する方法があります。それは、cfgファイルです。cfgファイルは、設定ファイルの拡張子です。.cfgファイルを使う場合のファイル構成は以下のようになっています。

cfgファイルに環境設定を書く

このように、developmentフォルダには、開発環境用の設定ファイルを、productionフォルダには、本番環境用の設定フォルダを書いています。以下は、開発環境時のsettings.cfgの例です。

import os
basedir = os.path.abspath(os.path.dirname(__name__))

SECRET_KEY='mysite'
SQLALCHEMY_DATABASE_URI='sqlite:///' + os.path.join(basedir, 'data_devlepment.sqlite')
SQLALCHEMY_TRACK_MODIFICATIONS=False
ENV='development'

cfgに書いた環境設定ファイルを読み込む

クラスの時と同じように、cfgファイルの読み込みは、__init__.pyが行います。具体的には、configファイルまでのパスを指定しておき、create_app関数の中で、読み込むファイルをどちらにするかosの環境設定で分けられるようにしています。

import os
from flask import Flask

config = {
    'development': 'config/development/settings.cfg',
    'production': 'config/production/settings.cfg'
}

def create_app():
    app = Flask(__name__)
    config_file = config[os.getenv('ENVIRONMENT', 'development')]
    app.config.from_pyfile(config_file)
    return app

ターミナルから環境設定する

本番環境、開発環境の切り替えは、ターミナルから行います。ターミナルコマンドはこちらになります。

export ENV='development'
(Windowsの場合は
set ENV='development')

os.getenvを使って環境変数を設定する

今まで、環境設定ファイルにsecret_keyなどを直接書いてきました。これを、外部から更新できるようにしてみましょう。それには、 os.environ.get() を使います。

このように、os.environ.getから、ターミナルで設定した環境変数を当てがうことができます。このように、外部から環境変数を設定して、環境設定ファイルに読み込ませることができます。


Flaskアプリ開発の全てがここに!アプリ構成の全てはこちらをご覧ください!

Flask入門: Webアプリケーション開発の基礎ガイド

Webアプリケーションとは Webアプリケーションの定義 Webアプリケーション…
benelop.jp