前置き
独学で、子供の成長アプリを作った時のことを、記録として残していきます。
間違っているところなどあれば、ご連絡お願いします。
①Djangoのようこそページへたどり着くまで
②NginxでDjangoのようこそページへたどり着くまで
③カスタムユーザーを作ってadminにたどり着く
④ログインログアウトをしよう
⑤ユーザー登録(サインイン)機能を作ろう
⑥ユーザーごとのデータ登録できるようにする〜CRU編
⑦ユーザーごとのデータ登録できるようにする〜削除編
⑧画像ファイルのアップロード
⑨身長体重を記録する@一括削除機能つき
⑩成長曲線グラフを描いてみよう
⑪本番環境へデプロイ+色々手直し<--最後です
Goal
本番環境(AWS EC2)へデプロイ
加えてデプロイするときに躓いたところを手直し。
アプリのバグ修正
これまでのコードだと、子供情報を登録する前に各データを参照すると
システムエラーになることがわかりました。以下のように直します。
*解説*
KidsProfile.objects.filter(user=user_name).first().id
ユーザー情報に紐づくKidsProfileが見つからなかった場合、
objects.filter()の場合、空クエリが返ってきます。
空クエリに対して「そのidを返せ」と言うので、AttributeErrorが返されます。
※objects.get()の場合、DoseNoteExistが返ってきます
それをtryで受け止めて、その場合はHTMLへの返却をNoneにします。
ついでに「子供情報を入れてね」とメッセージを添えます。
#靴リスト
@login_required
def shoes_data_list(request, **kwargs):
user_name = request.user
try:
if len(kwargs) > 0:
kids_profile_id = kwargs["kidsProfileId"]
else:
kids_profile_id = KidsProfile.objects.filter(user=user_name).first().id
kids_profiles = KidsProfile.objects.filter(user=user_name) #子供情報選択用
kids_profile_name = KidsProfile.objects.get(id=kids_profile_id).name
shoes_data_posts = ShoesData.objects.filter(user=user_name, kidsProfile=kids_profile_id).order_by('buy_date')
except AttributeError:
shoes_data_posts = None
kids_profiles = None
kids_profile_name = "子供情報を登録してください"
params = {
'shoes_data_posts' : shoes_data_posts,
'kidsProfiles' : kids_profiles,
'kidsName' : kids_profile_name,
}
return render(request, 'shoes/shoes_data_list.html', params)
Githubへコードを上げる
Githubへの上げるためにやったことは、4つ。
1.setting.pyの分割
このファイルにはSEACRET_KEYやRDSの情報が書いてあるので、
Githubに上げられない。settings.pyからsettings_localをimportする形にして、
.gitignoreで指定してあげる。
SECRET_KEY = '*************'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': '*************',
'PASSWORD': '*************',
'HOST': '*************',
'PORT': 5432,
}
}
import os
from .settings_local import *
(略)
2..gitignoreファイルの作成
http://gitignore.io
この変を参考にしながら設定。
migrations履歴は移動しないほうが良いらしい。
でも_init_.pyがないとmigrationで失敗するはずなので、本番へ持っていく。
*.log
*.pot
*.pyc
pycache/
src/mysite/settings_local.py
db.sqlite3
**/media/**
!**/media
**/migrations/**
!**/migrations
!**/migrations/__init__.py
3..gitignoreで/media/をgithubに上げないようにしたので、
靴画像のデフォルト画像を/media/から/static/へ移動。
staticにファイルを増やしたので、Collectstaticを実施。
4.uwsgiの設定見直し
djangoはローカルで試しながら作るときはrunserverのほうが良い。
その結果、コメントアウトで使い分ける形にしてみた。
合わせて本番向けにはuwsgiの起動はiniファイルを読ませるように修正。
version: "3"
services:
db-postgres:
image: postgres
# 本番デプロイ用定義
# 開発中は、こっちは全部コメントアウトするよ
nginx:
image: nginx:1.13
ports:
- "8000:8000"
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
- ./static:/static
depends_on:
- web
web:
build: ./web
volumes:
- ./src:/code
- ./static:/static
depends_on:
- db-postgres
command: uwsgi --ini /code/mysite/uwsgi.ini #ここが②から変わってます
expose:
- "8000"
# 開発中定義
# 本番にあげるときはこっちをコメントアウトするよ
#
# web:
# build: ./web
# volumes:
# - ./src:/code
# - ./static:/static
# depends_on:
# - db-postgres
# command: python manage.py runserver 0.0.0.0:8000
# ports:
# - "8000:8000"
[uwsgi]
socket = :8000
chmod-socket = 666
module = mysite.wsgi
wsgi-file = /code/mysite/wsgi.py
logto = /code/mysite/uwsgi.log
processes = 1
vacuum=True
max-requests=5000
あとは
・ローカルからGithubにpush
・EC2にGithubにpull
・EC2上でsetting_local.pyを作成
で、EC2上で、起動!
docker-compose up