#はじめに
・django-environを使用し、シークレットキーを読み取れなかった時の対処法を書きます。
今回些細すぎるミスにより、4時間ほど解決のために時間を費やしたので、自分への戒めと備忘録として書きます。
また、どの記事にも単純なミスすぎて記載されてなかったので、記事を書きます。
#前提
- Python 3.9.7
- Django 3.2.5
- django-environ 0.4.5
- 仮想環境
- venv
解決方法
環境におけるdatabase.ymlを参照できていなかった。今回はcredintialsにdatabase.ymlのデータベースの設定を入れ、参照させることで解消した。
app
├── base
├── config
│ └── settings.py
├── manage.py
├── requirements.txt
└── secrets
├── .env.dev
└── .env.prod
今回、開発環境でシークレットキーを渡したかったため、「.env.dev」ファイルとしています。
SECRET_KEY=「シークレットキー」 #「」は不要です
DEBUG=True
ALLOWED_HOSTS=*
from pathlib import Path
import environ #追記
BASE_DIR = Path(__file__).resolve().parent.parent
#追記
env = environ.Env()
root = environ.Path(BASE_DIR / 'secrets') #manage.pyの階層にあるsecretsを読み込む
#下記の二つはif文で本番と開発環境を分けると後々楽です。
# 本番環境用
# env.read_env(root('.env.prod'))
# 開発環境用
env.read_env(root('.env.dev'))
#シークレットキーはギットハブに絶対にあげない
SECRET_KEY = env('SECRET_KEY')
DEBUG = env.bool('DEBUG')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
動作確認
python manage.py runsevere
こちらで問題なく動作するはずが
raise ImproperlyConfigured(error_msg)
django.core.exceptions.ImproperlyConfigured: Set the SECRET_KEY environment variable
前提のコードで記述するとこういうエラーが出ます。
#考えられる原因
考えられる原因は2点考えられると思います。
1つ目
root = environ.Path(BASE_DIR / 'secrets')
env.read_env(root('.env.dev'))
ここの記述が間違えており、env.read_env
で読み込めていない。
2つ目
こちらは前提の記述
SECRET_KEY=「シークレットキー」 #「」は不要です
もしこちらが
SECRET_KEY= 「シークレットキー」 #「」は不要です
上記のように = と「シークレットキー」の間に無駄な余白があれば上手く読み込めないエラーになります。
でも読み込めていない原因は上記の二つではありませんでした
#解決方法
単純にタイプミスでした。
前提↓
SECRET_KEY=「シークレットキー」 #「」は不要です
解決できるコード↓
SECRET_KEY=「シークレットキー」 #「」は不要です
お分かりかもしれませんが、「=」がかな文字の「=」でした。
#おわりに
くだらない記事を最後まで見て頂いてありがとうございます。
現在未経験で、知見も技術もない初学者ですが、こういうミスでプログラムが動かなくなるんだと知ることができたのでよかったかもしれません、、
同じように「シークレットキー」が何故か読み取れないみたいな人は、「=」も注意して見て欲しいです。
誰かのお役に立つことを願っております。
誠にありがとうございました。