【その7】settings.py変更【初めてのAWSデプロイ編】
投稿者: urumos
作成日: 2022年5月29日16:26
更新日: 2022年5月29日21:57
カテゴリ: 初めてのAWSデプロイ
タグ:
本番環境とテスト環境を切り分け、Githubに公開すべきでないデータを隠す方法は下記の2つに分かれるらしい。
①local_setting.pyというファイルをつくって対応する方法
②環境変数に格納する方法
調べたところ①よりも②のほうが良さそうなので、②でいく。
と思ったけど自社アプリはlocal_setting.pyでやってそうなので①でいく。
と思ったけど、両方使っている、、?
よくわからんが頑張って整理しよう。
今回参考にさせてもらっている各記事でどうやっているか整理
1つ目の記事(自動化なしに生活なし。2021年7月)
ホストはsetting.pyに直書き
local_setting.pyにシークレットキーとデータベース情報を記述
データベースと静的ファイル配信はsetting.pyで場合分けしている
django-environは使っていない
2つ目の記事(トマト好きの方。2021年8月)
Let's Encryptで提供されているcerbotツールを使ってHTTPS化している
ホスト、データベース、静的ファイル配信はsetting.pyに直書きで場合分けしてない。(運用まで考慮されてない?)
3つ目の記事(Qiitaポコツンさん。2019年9月)
Let's Encryptで提供されているcerbotツールを使ってHTTPS化している
ホスト、データベース、静的ファイル配信はsetting.pyに直書きで場合分けしてない。(運用まで考えていない?)
この記事は大分スピーディな印象。
4つ目の記事(Qiitaバシさん。【丁寧解説】。2021年12月)
django-environを使用
ローカルにもAWSにもそれぞれ別の.envファイルを置き、
その中にシークレットキー、デバッグ設定、データベース設定を書いている。
この記事が一番丁寧そう。きっと丁寧で几帳面な人が書いてくださっている。
これを真似してみよう。
まず、ローカルにpipでdjango-environをインストール
と、ここでpipコマンドで下記のようなエラーが出た。
Fatal error in launcher: Unable to create process using...
色々調べたら環境変数に複数のPythonのPathが通っていることが原因っぽかったけど、
pipを更新すれば解決したという記載もあったので試してみたら解決した。
気を取り直してdjango-environをインストールする。仮想環境に入り下記コマンド
pip install django-environ
無事インストールできた。
次にローカルのプロジェクトディレクトリに.envというファイルを作り、下記を入力
SECRET_KEY=setting.pyからコピペ
DEBUG=False
DATABASE_URL=sqlite:///db.sqlite3
setting.pyの下記の部分を修正。
import environ
import os
...
env = environ.Env()
env.read_env(os.path.join(BASE_DIR,'.env'))
SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
...
DATABASE = {
'default': env.db(),
}
この状態で、一度runserverしてみると、SECRET_KEYについてエラーが出た。
色々試して、「.env.txt」を拡張子なしの「.env」に変更したらエラー解消した。
適当にtxtでいいかと思って作ったけど、特に指定なければ拡張子なしで作らなきゃなのね。
早速ブラウザで開くが開けない。今度はALLOWED_HOSTSのついてのエラーだ。
考えてみたらALLOWED_HOSTSは"XXX.com"だけ許可にしていたから無理なわけだ。
ローカルの.envに「ALLOWED_HOSTS=127.0.0.1」と追加し、
setting.pyのALLOWED_HOSTS部分を「ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')」にしたら無事サイトが開けた。
何だかエラー解決スピードが上がっている気がする!^^
.gitignoreに.envを追加してリモリポにpush。
次にWebサーバー側の作業。Tera term起動してSSH接続。
git pullでリポジトリを最新にする。
vim .envコマンドでWebサーバー用の.envファイルを作る。下記を入力。
SECRET_KEY=上と同じの
DEBUG=False
DATABASE_URL=sqlite:///db.sqlite3 (➡あとでpostgresqlに変更)
ALLOWED_HOSTS=XXX.com
これでrunserverしてみる。
無事にブラウザでXXX.com:8000で開けた!!
何か感覚がわかってきたぞ~~!
★「os.path.join()」関数について
os.pathモジュールの関数の一つ。パスの名前の操作に関する処理ができる。
引数に与えられた文字列を結合(join)させ、一つのパスにする事ができる。
なお、「os.path.basename()」は()内のパスのファイル名を取得する関数。
次はデータベースをsqliteからpostgresqlに変更してみよう。
postgresqlの設定は終わっているので、.envだけ書き換える
書式は下記
DATABASE_URL=postgres://データベースユーザー名:そのユーザーのパスワード@ホスト:ポート/データベース名
現在
DATABASE_URL=sqlite:///db.sqlite3
変更
DATABASE_URL=postgres://XXX:ZZZZZ@localhost:/djblogdb
変更後、runserverしたらno such table: blog_postエラーになった。
マイグレーションする
python3.9 manage.py migrate
上手くいったみたい。再度runserver。
サイトが表示された!
ただし、以前作成したAWS用の初投稿は無くなっている。予想通り。
投稿を追加するために管理画面にアクセス。。
と、また忘れてた。createsuperuserからやらなきゃだ。
python3.9 manage.py createsuperuser
無事管理画面にログインでき、投稿を追加できた!
これでOK!
①local_setting.pyというファイルをつくって対応する方法
②環境変数に格納する方法
調べたところ①よりも②のほうが良さそうなので、②でいく。
と思ったけど自社アプリはlocal_setting.pyでやってそうなので①でいく。
と思ったけど、両方使っている、、?
よくわからんが頑張って整理しよう。
今回参考にさせてもらっている各記事でどうやっているか整理
1つ目の記事(自動化なしに生活なし。2021年7月)
ホストはsetting.pyに直書き
local_setting.pyにシークレットキーとデータベース情報を記述
データベースと静的ファイル配信はsetting.pyで場合分けしている
django-environは使っていない
2つ目の記事(トマト好きの方。2021年8月)
Let's Encryptで提供されているcerbotツールを使ってHTTPS化している
ホスト、データベース、静的ファイル配信はsetting.pyに直書きで場合分けしてない。(運用まで考慮されてない?)
3つ目の記事(Qiitaポコツンさん。2019年9月)
Let's Encryptで提供されているcerbotツールを使ってHTTPS化している
ホスト、データベース、静的ファイル配信はsetting.pyに直書きで場合分けしてない。(運用まで考えていない?)
この記事は大分スピーディな印象。
4つ目の記事(Qiitaバシさん。【丁寧解説】。2021年12月)
django-environを使用
ローカルにもAWSにもそれぞれ別の.envファイルを置き、
その中にシークレットキー、デバッグ設定、データベース設定を書いている。
この記事が一番丁寧そう。きっと丁寧で几帳面な人が書いてくださっている。
これを真似してみよう。
まず、ローカルにpipでdjango-environをインストール
と、ここでpipコマンドで下記のようなエラーが出た。
Fatal error in launcher: Unable to create process using...
色々調べたら環境変数に複数のPythonのPathが通っていることが原因っぽかったけど、
pipを更新すれば解決したという記載もあったので試してみたら解決した。
気を取り直してdjango-environをインストールする。仮想環境に入り下記コマンド
pip install django-environ
無事インストールできた。
次にローカルのプロジェクトディレクトリに.envというファイルを作り、下記を入力
SECRET_KEY=setting.pyからコピペ
DEBUG=False
DATABASE_URL=sqlite:///db.sqlite3
setting.pyの下記の部分を修正。
import environ
import os
...
env = environ.Env()
env.read_env(os.path.join(BASE_DIR,'.env'))
SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
...
DATABASE = {
'default': env.db(),
}
この状態で、一度runserverしてみると、SECRET_KEYについてエラーが出た。
色々試して、「.env.txt」を拡張子なしの「.env」に変更したらエラー解消した。
適当にtxtでいいかと思って作ったけど、特に指定なければ拡張子なしで作らなきゃなのね。
早速ブラウザで開くが開けない。今度はALLOWED_HOSTSのついてのエラーだ。
考えてみたらALLOWED_HOSTSは"XXX.com"だけ許可にしていたから無理なわけだ。
ローカルの.envに「ALLOWED_HOSTS=127.0.0.1」と追加し、
setting.pyのALLOWED_HOSTS部分を「ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')」にしたら無事サイトが開けた。
何だかエラー解決スピードが上がっている気がする!^^
.gitignoreに.envを追加してリモリポにpush。
次にWebサーバー側の作業。Tera term起動してSSH接続。
git pullでリポジトリを最新にする。
vim .envコマンドでWebサーバー用の.envファイルを作る。下記を入力。
SECRET_KEY=上と同じの
DEBUG=False
DATABASE_URL=sqlite:///db.sqlite3 (➡あとでpostgresqlに変更)
ALLOWED_HOSTS=XXX.com
これでrunserverしてみる。
無事にブラウザでXXX.com:8000で開けた!!
何か感覚がわかってきたぞ~~!
★「os.path.join()」関数について
os.pathモジュールの関数の一つ。パスの名前の操作に関する処理ができる。
引数に与えられた文字列を結合(join)させ、一つのパスにする事ができる。
なお、「os.path.basename()」は()内のパスのファイル名を取得する関数。
次はデータベースをsqliteからpostgresqlに変更してみよう。
postgresqlの設定は終わっているので、.envだけ書き換える
書式は下記
DATABASE_URL=postgres://データベースユーザー名:そのユーザーのパスワード@ホスト:ポート/データベース名
現在
DATABASE_URL=sqlite:///db.sqlite3
変更
DATABASE_URL=postgres://XXX:ZZZZZ@localhost:/djblogdb
変更後、runserverしたらno such table: blog_postエラーになった。
マイグレーションする
python3.9 manage.py migrate
上手くいったみたい。再度runserver。
サイトが表示された!
ただし、以前作成したAWS用の初投稿は無くなっている。予想通り。
投稿を追加するために管理画面にアクセス。。
と、また忘れてた。createsuperuserからやらなきゃだ。
python3.9 manage.py createsuperuser
無事管理画面にログインでき、投稿を追加できた!
これでOK!