先日、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 environdjango-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を使ってみではいかがでしょうか。
以上です。




コメント