概要
クラウドサービスから情報を取得したりするとき、プログラムを書くとき、ハードコーディングしないための方法です。
今回は環境変数を利用してハードコーディングでgithub等にあげてしまわないようにします。
クラウドのデータベースをSQLAlchemyで読み込み、Flaskを実行するプログラムを例にしています。
方法
自分のOS内だけにもつ環境変数を用い、動作させるプログラムにユーザ名とパスワードを入力せず、環境変数から取得するように書きます。
環境変数をセット
今回の例では3つの環境変数(db_acount,db_passwd,db_url)に指定した値を定義しています。exportで代入する環境変数はシェルを閉じた瞬間消えてしまうため、環境変数を定義する場合は現在のシェルを実行するsource
を使います。
source variable.sh
#variable.sh #!/bin/sh export db_user="<db_user_name>" export db_passwd="<db_password>" export db_host="<db_host>" export db_name="<db_name>"
環境変数をプログラムから読み込む
os.environ.get
を利用することで先ほど定義した環境変数を読み込むことができます。
以下では先ほどの環境変数を読み込み、クラウドのMySQLに接続するコードです。
プログラム内にはユーザ名やパスワードを入力されていないためソースコードを安全にgithub等にあげることができます。
# application.py from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_sslify import SSLify import os user = os.environ.get("db_acount") password = os.environ.get("db_passwd") host = os.environ.get("db_url") app = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://{0}:{1}@{2}/{3}?charset=utf8".format(db_user,db_password,db_host,db_name) app.config["JSON_AS_ASCII"] = False db = SQLAlchemy(app) class UserData(db.Model): __tablename__ = "db" id = db.Column(db.Integer, primary_key=True) message = db.Column(db.Text) with app.app_context(): db.create_all() #Setting_Flask app = Flask(__name__) sslify = SSLify(app) #API-routing @app.route...