先日、Djangoチュートリアルのその1についての記事をアップしました。
その中で、ソースコードを Github にプッシュしましたが、プッシュ後に Github からこんなメールが届いていました。
GitGuardian has detected the following Django Secret Key exposed within you Github account.
Django のシークレットキーがプッシュされましたよ〜というお知らせのようです。
こんな機能があるんですね。
チュートリアルのものなので問題はありませんが、シークレットキーやパスワードなどは Git の管理対象からは除外すべです。
ということで、Git の管理対象から除外してみます。
シークレットキーはsettings.py
に含まれているので、settings.py
自体を Git の管理対象から除外するのもありですが、重要な情報は環境変数として別ファイル.env
で保持し、settings.py
からは.env
を参照させる方法をとっている事例が多そうなので、その方法でやってみます。
今回はdjango-environ
という外部ライブラリ(パッケージ)を使います。
インストール
まずはpipenv
でdjango-environ
をインストールします。
pipenv install django-environ
※pipenv
を使わない場合はpip
でインストールしてください。
.envファイルを作成
次にmanage.py
と同じ場所に.env
ファイルを作成します。
.env
ファイルには次のように記載します。
SECRET_KEY='django-insecure-wy^n7$tt2^q=w(gxk&c&p*r=6d*w!4le#_d#6^yy_p0e8156pl'
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1
シークレットキー 以外に、デバッグ機能のオンオフ と Webサーバーのドメイン名やIPアドレスを指定すALLOWED_HOSTS
の情報も.env
ファイルに含めるようにしました。
データベースの情報を含めたほうが良いですが、データベースが SQLite なので、今回はsettings.py
に残すことにしました。
settings.pyを編集
次にsettings.py
を編集します。
追記・変更箇所のみ記載します。
# 下記は追記
import environ
env = environ.Env(
# set casting, default value
DEBUG=(bool, False)
)
env.read_env('.env')
# 下記は変更
SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
細かく見ていきます。
import environ
django-environ
パッケージをインポートしています。
env = environ.Env(
# set casting, default value
DEBUG=(bool, False)
)
Env
クラスをインスタンス化し、デフォルト値を設定しています。
上記の場合、.env
ファイルにDEBUG
の値が記載されていなかった場合、False
が設定されます。
そのため、本番環境にデプロイした際は環境変数にDEBUG
の項目は不要です。
env.read_env('.env')
.env
ファイルを読み込んでいます。
SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
.env
ファイルから読み込んだ値をそれぞれ設定しています。
env.list()
は読み込んだ値をリストに変換しています。
.gitignoreファイルに.envを追加
最後に、Git の管理対象から除外するフォルダー、ファイルを指定する.gitignore
ファイルに.env
ファイルが記載されていない場合は追加してください。
この.gitignore
の内容ですが、私は下記サイトを利用して作成しています。
こんな感じで、言語、フレームワーク、OS、IDEなどを指定するだけで、.gitignore
ファイルの内容を作成してくれます。Python
を指定するだけでも.env
が入っているので、標準で入るんじゃないかと思います。
Github
django-admin
を導入した状態を Github のリポジトリにプッシュしました。
差分
ファイル
公式ドキュメント
公式のドキュメントもリンクを貼っておきます。
おわりに
今回は
django-envrion
でシークレットキーをGit管理対象から除外する方法
をお届けしました。
Web サイトのソースコードを Github 上で公開するようなケースはあまり無いのかもしれませんが、環境毎に変わるものを環境変数として別ファイルで管理した方が良いケースは多いと思うので、そういう場合にもdjango-environ
を使ってみではいかがでしょうか。
以上です。
コメント