\ お問い合わせはこちら! /

DjangoのSECRET_KEYを再生成する方法

  • まちがえてSECRET_KEYをGitHubにプッシュしてしまった!
  • Django標準の機能でSECRET_KEYを生成したい!

このような疑問にお答えします。

SECRET_KEYは、以下の条件を満たす必要があります。

  • 5種類以上の文字を使用
  • 50文字以上の長さ

これを自力で考えるのはとても大変なので、Django組み込みの関数を使って生成する方法をお伝えします。

DjangoのSECRET_KEYを再生成する方法

Django 組み込みの関数でキーを発行

DjangoでSECRET_KEYを再生成するには、以下の関数を使います。

from django.core.management.utils import get_random_secret_key

# SECRET_KEYを生成する
new_secret_key = get_random_secret_key()
print(new_secret_key)

get_random_secret_key()関数は、Djangoがsettings.pySECRET_KEYを生成しているものなので安心して使えます。

環境変数で管理することでセキュリティ向上を目指す

SECRET_KEYはハードコーディングせずに、環境変数として管理することが推奨されます。

もちろんget_random_secret_key()を使ってから.envに文字列を貼り付けても良いですが、ちょっと面倒なのでシェルスクリプトを作ってコマンド一つで実装できるようにしましょう。

スクリプトは以下になります。

#!/bin/bash

# OSの種類を判定
if [[ "$OSTYPE" == "darwin"* ]]; then
    # MacOS
    OS_TYPE="MacOS"
else
    # その他のUNIX系OS(主にLinux)
    OS_TYPE="Other"
fi

# DjangoでSECRET_KEYを生成
SECRET_KEY=$(python3 -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())")

# .envファイルのパスを指定
ENV_FILE=".env"

# .envファイルの存在確認
if [ -f "$ENV_FILE" ]; then
    echo ".envファイルが見つかりました。SECRET_KEYを更新します。"
    
    # OSに応じてsedコマンドを実行
    if [ "$OS_TYPE" == "MacOS" ]; then
        sed -i '' '/^SECRET_KEY=/d' "$ENV_FILE"
    else
        sed -i '/^SECRET_KEY=/d' "$ENV_FILE"
    fi
    
    echo "SECRET_KEY=$SECRET_KEY" >> "$ENV_FILE"
    echo "SECRET_KEYを更新しました。"
else
    echo ".envファイルが見つかりません。新しく作成します。"
    echo "SECRET_KEY=$SECRET_KEY" > "$ENV_FILE"
    echo ".envファイルを作成し、SECRET_KEYを設定しました。"
fi

# 変更の確認
echo "更新後の.envファイルの内容:"
cat "$ENV_FILE"

これをプロジェクトのルートディレクトリに配置して、以下のコマンドを実行します。

bash ./update_env_secret_key.sh

環境変数のSECRET_KEYをsettings.pyで読み込むために、以下のように書き換えます。

import environ

# .envファイルのパスを指定
env = environ.Env()
environ.Env.read_env(".env")

SECRET_KEY = env("SECRET_KEY")

.gitignoreファイルで.envを Git 管理対象外にしておくことで、間違ってキーを公開してしまうことを防げます。

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

karo@プログラマのアバター karo@プログラマ プログラマ

「書くことで人の役にたつ」をモットーに活動中。
本職はプログラマで、Pythonが得意。
基本情報技術者試験合格。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)