質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

django-environとgitignoreが上手く機能しません

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 639

abryt69

score 7

前提・実現したいこと

django2系でサイトを作っています。
データベースのパスワードやメールのパスワード、SECRET_KEYなどgit管理から外したいものの扱い方に困っています。

発生している問題・エラーメッセージ

django-environをインストールし、プロジェクト直下に.envを作成しました。
.gitignoreには.envをgit管理から外すよう記載したのですが、そうすると本番環境で.envからSECRET_KEY等々を読み込めずにエラーが出てしまいます。

django.core.exceptions.ImproperlyConfigured: Set the SECRET_KEY environment variable

該当のソースコード

# .env
SECRET_KEY=*****************************

DATABASE_URL=mysql://9999999999:000000000@*******:1111111/22222222

EMAIL_URL=smtp://*******@:000000@111111:222
# settings.py
import environ

env = environ.Env(DEBUG=(bool, False),)
environ.Env.read_env('.env')

DATABASES = {
    'default': env.db(),
}

EMAIL_CONFIG = env.email_url()

SECRET_KEY = env('SECRET_KEY')

試したこと

django-environの前はpythonファイルを作成し、そこに秘匿変数を書いていたのですが、結局どちらもgitignoreしてしまうと本番環境で読み込めずエラーが出てしまいました。

補足情報(FW/ツールのバージョンなど)

サーバーはHerokuです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

django-environの前はpythonファイルを作成し、そこに秘匿変数を書いていたのですが、結局どちらもgitignoreしてしまうと本番環境で読み込めずエラーが出てしまいました。

この「pythonファイル」というのは settings.py の中の一部の設定を記述した独自のファイルで、それを settings.py から読み込まれていた、という理解で正しいですか?

また、「秘匿変数」というのは何でしょう? SECRET_KEY や DATABASE_URL のことをそう呼ばれているのですか?

いずれの質問もお答えは「はい」だと仮定して以下回答させていただきます。認識が違っていれば教えてください。

.gitignoreには.envをgit管理から外すよう記載したのですが、そうすると本番環境で.envからSECRET_KEY等々を読み込めずにエラーが出てしまいます。

もし .env が存在することを前提としたコードを書かれていて、 .env を Heroku 環境に push しないように変更されたのであれば、 Heroku 環境でエラーが出るのはむしろ当然なのではないかと思います。

最終的にどのような形で運用されたいのかわからないので的外れな意見かもしれませんが、例えば、「お手元の開発環境では .env を利用し、本番環境では環境変数をそのまま利用する形」にされたいのであれば、 settings.py では次のように記述しておき、ローカルでは常に DEBUG=True とする、 Heroku 上は管理画面から環境変数をセットする、という風にされるとよいかと思います。

if DEBUG:
    environ.Env.read_env('.env')

もしくは、(本番環境で warning が出てしまう気がしますが)次のようにすると、 .env ファイルが存在するときだけ読み込む挙動にできそうなので、 DEBUG を使った分岐をされたくなければこの方向でよい形を模索されるとよいのではないでしょうか( django-environ のコード をちらっと読んでこう思っていますが、私の手元で動作確認はしていません。間違っていればすいません)。

- environ.Env.read_env('.env')
+ environ.Env.read_env()

ご参考になればと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/05 11:22

    gh640様

    ご回答下さいましてありがとうございます。
    上記の仮定に関しましては両方とも「はい」でございます。勝手な造語でお話ししてしまい失礼致しました・・・

    本番環境では、Herokuに設定されている環境変数から読み込むのですね・・・てっきりファイルから読み込むと思っていたのですが、pushしては意味が無いし、pushしないと読み込めないしと悩んでおりました。

    ありがとうございます!

    キャンセル

  • 2019/01/05 14:40

    abryt69 様

    すばやくご返信くださりありがとうございます。そうでしたか。このあたりは一度知ればなんてことはないのですが、悩みますよね。上で環境変数を「管理画面から」セットする、と述べましたが、 `heroku` コマンドでセットする形 https://devcenter.heroku.com/articles/config-vars でもよいと思います。お好みの方法でやってみてください :)

    キャンセル

  • 2019/01/05 20:49

    gh640様

    詳しくご教授くださいましてありがとうございます。
    SECRET_KEYに関しては問題なく読み込めたのですが、JAWSDB_URLに関してはHOST・USER_NAME等々全て個別に設定して読み込んでいるのですが、正しいやり方(スマートなやり方?)なのでしょうか・・・?
    DATABASE = { 'default': { os.environ['JAWS_DB'] } }ではエラーが出てしまったので・・・そもそもDB関連はパスワードのみgit管理から外せばいいものなのでしょうか?

    キャンセル

  • 2019/01/05 21:36

    abryt69 様

    質問文に書かれているとおり `env.db()` を使うとすっきり書けるのではないかと思います。

    ```
    DATABASES = {
    'default': env.db('JAWSDB_URL'),
    }
    ```

    せっかく django-environ を使われているので `os.environ` を使うのではなく django-environ の機能を使われるとよいのではないでしょうか。そういうことではなくて、ですか?

    尚、ここの記述を変える場合はローカルの `.env` の中身もあわせて変更する必要があるかと思います。ご注意ください。

    このあたりは django-environ のドキュメントに書かれているので、一度ご覧になってみてください。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる