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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

888閲覧

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

abryt69

総合スコア13

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/04 09:28

前提・実現したいこと

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

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

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

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

該当のソースコード

python

1# .env 2SECRET_KEY=***************************** 3 4DATABASE_URL=mysql://9999999999:000000000@*******:1111111/22222222 5 6EMAIL_URL=smtp://*******@:000000@111111:222

python

1# settings.py 2import environ 3 4env = environ.Env(DEBUG=(bool, False),) 5environ.Env.read_env('.env') 6 7DATABASES = { 8 'default': env.db(), 9} 10 11EMAIL_CONFIG = env.email_url() 12 13SECRET_KEY = env('SECRET_KEY') 14

試したこと

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

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

サーバーはHerokuです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

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

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

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

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

python

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

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

patch

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

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

投稿2019/01/05 01:49

gh640

総合スコア1407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abryt69

2019/01/05 02:22

gh640様 ご回答下さいましてありがとうございます。 上記の仮定に関しましては両方とも「はい」でございます。勝手な造語でお話ししてしまい失礼致しました・・・ 本番環境では、Herokuに設定されている環境変数から読み込むのですね・・・てっきりファイルから読み込むと思っていたのですが、pushしては意味が無いし、pushしないと読み込めないしと悩んでおりました。 ありがとうございます!
gh640

2019/01/05 05:40

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

2019/01/05 11:49

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

2019/01/05 12:36

abryt69 様 質問文に書かれているとおり `env.db()` を使うとすっきり書けるのではないかと思います。 ``` DATABASES = { 'default': env.db('JAWSDB_URL'), } ``` せっかく django-environ を使われているので `os.environ` を使うのではなく django-environ の機能を使われるとよいのではないでしょうか。そういうことではなくて、ですか? 尚、ここの記述を変える場合はローカルの `.env` の中身もあわせて変更する必要があるかと思います。ご注意ください。 このあたりは django-environ のドキュメントに書かれているので、一度ご覧になってみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問