Djangoのデータモデルとデータベースの関係を理解してHerokuへデプロイする方法【PostgreSQL】

この記事は約14分で読めます。
広告

Djangoで作ったアプリをPaizaCloud(開発環境)と
Heroku(無料、本番環境)にデプロイすることで
データモデルとデータベースの関係の理解を深めることができます。
使用するデータベースはPostgreSQL。
プログラムとターミナルの作業の切り分けなど
疑問に思えるところをクリアにしていきたいと思います。
開発環境含めすべてWEB上のものを利用しているので
自分のパソコンには何もインストールしてません。
PaizaCloudなんかうまくいかなかったらサーバー削除して1から簡単に再開できます。
無料版だと使い勝手は悪いですが。

完成品はこちらになります。
学習用のものを変更せず上げてあります。
デプロイするためにsettings.pyのみ変更しています。
Windows10を使用
Git、Heroku CLIをパソコンにインストールしないでやってます。

広告

参考にしたYoutube

まずこちらのYoutubeを見てください。

「本堂俊輔のITエンジニアチャンネル」さんのDjangoチュートリアルです。
今回該当する内容は#5~#7です。(Herokuへのデプロイは#3、4も参照)
#7の完成品をPaizaCloudとHerokuでPostgreSQLで動くように変更します。
#7の元のコードはSqlite3用で以下のYoutubeの概要欄にあります。
これが汎用ビューの力!最小コードでウェブサービスを作ろう | djangoチュートリアル #7

動画の内容をいろいろ駆使してやりましたがうまくいかず。
初心者の私がいろいろ調べてPostgreSQLで動くようにできた内容で
保証できるものではありませんので、そこはご了承ください。
データベースをPostgreSQLにした理由はHerokuに最初から入ってるからです。
PaizaCloud、GitHub、Herokuの基本的なところはこちらの記事を参考にしてください。

Djangoのデータモデルとデータベースの関係を理解するポイント

私がポイントだと思う点をあげると

  • データベースを接続してしまえばプログラムでデータベースを意識する必要はない。
  • データベース作成や初期データ設定などはターミナルで実行できる。
  • Djangoのデータモデルはmodeles.pyで定義されpython manage.py makemigrationsでmigrationsディレクトリに中間ファイルができ、python manage.py migrateでデータベースにその内容が反映される。なのでmodeles.pyを変更したときだけpython manage.py makemigrationsすればいい。
  • プロジェクト内に複数のアプリがある場合でも各migrationsディレクトリに0001_initial.py・・・・・ができるが特別に何かやる必要なく普通にpython manage.py migrateすればデータベースに反映される。

目次へ

PaizaCloudで動かす

ベースのコード準備

PaizaCloudを立ち上げ
新規サーバー作成→DjangoとPostgreSQLを選んで作成します。
これが汎用ビューの力!最小コードでウェブサービスを作ろう | djangoチュートリアル #7
動画の下の「もっと見る」をクリックすると
■完成版プロジェクト&テキストがあります。
そこへいき緑色のcodeをクリック、コピーマークを押して
https://github.com/*****.gitをコピー
ターミナルを開いて、以下を実行。

git clone コピーしたもの(https://github.com/*****.git)を貼り付けてEnter。
フォルダを移動
cd django-website-07

データベース接続設定(プログラム)

プログラム部分です。
動画とはだいぶ変えています。

データベース接続部分の変更

settings.pyを以下のように変更
変更前(デフォルトのSQlite3を使うとき)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

変更後

#PaizaCloudの時(PostgreSQLを使うとき)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'pj_db',
        'USER': 'postgres',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}
全般的な話として
settings.pyを以下のように変えて私は使ってます。
変更前
DEBUG = True

ALLOWED_HOSTS = ["*"]

変更後
DEBUG = False

ALLOWED_HOSTS = ['localhost-人によって違うところ.paiza-user-free.cloud', '人によって違うところ.herokuapp.com']

詳細は以下参照してください。

目次へ

PostgreSQLインストールとデータベース作成(ターミナルで作業)

ターミナル操作部分です。

Postgres用ライブラリのインストール
×pip install psycopg2-binary
は新しいバージョンで先に進むとエラーの原因になったので
古いバージョンを使います。
pip install psycopg2-binary==2.8.6
プロジェクト用のデータベースを作成
Postgresにログイン
sudo -u postgres psql postgres

ユーザーにパスワード設定
postgresというユーザーにパスワードを設定するという意味。

\password postgres   /が¥に変わってるいてもOK

password2回入力(password以外でもいいが変更した場合はsettings.pyの
上記で変更した
DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'pj_db',
    'USER': 'postgres',
    'PASSWORD': 'password', ←ここを変える

データベース作成
CREATE DATABASE pj_db;

Postgresからログアウト
\q

マイグレートして項目を作成
python manage.py migrate
django shell(対話的にプログラムを実行できる)の起動
python manage.py shell

カテゴリとタグとサンプル投稿を作成
django shellで以下をコピーアンドペーストして実行してサンプルデータを作成。
データベースの中身を入れておかないとエラーになるので。

from blog.models import *
cat = Category.objects.create(name="cat 1")
Category.objects.create(name="cat 2")
tag1 = Tag.objects.create(name="tag 1")
tag2 = Tag.objects.create(name="tag 2")
Tag.objects.create(name="tag 3")
post = Post()
post.title = "post 1"
post.body = "body 1"
post.category = cat
post.save()
post.tags.add(tag1)
post.tags.add(tag2)
post.save()
exit

サーバー起動
python manage.py runserver

これでPaizaCloudでは動いてます。
目次へ

Djangoチュートリアルを変えた部分

ググって試行錯誤した結果なので変更した理由は説明できない。😢

やってないこと及び変更点
pip install dj-database-url
pip install python-dotenv
pip install psycopg2-binary→pip install psycopg2-binary==2.8.6
.envも作らず
環境設定ファイルを設置もやってない
DATABASE_URL=postgres://postgres:password@localhost/pj_db
settings.py変更

Herokuで動かす

Heroku のための Django アプリの設定を参考にしました。
settings.pyでHeroku用に書き換える部分はPaizaCloud上で変更すると
静的ファイルを集めるところでエラーになるので
GitHubで変更した。

ファイル追加

ディレクトリ構成
django-website-07ディレクトリ
  ├pj_blogディレクトリ
  │ ├settings.py
  │ └・・・
  ├blogディレクトリ
  ├requirements.txt
  ├Procfile

django-website-07を右クリックして新規ファイル作成で
2つファイル追加

requirements.txt
内容
django
gunicorn
whitenoise
psycopg2-binary==2.8.6はいらない。
PaizaCloud上で動かすときのみ使用するのと
PaizaCloudで動かすときはrequirements.txt自体使っていない。
ここでHeroku用に編集をやってもいい。
PaizaCloudで動かすときはsettings.pyのHeroku用設定をコメントアウトしてPaizaCloud用に戻す必要があります。
Procfile(pj_blogはwsgi.pyのあるディレクトリ名)
内容
web: gunicorn pj_blog.wsgi

静的ファイル対応

django-website-07右クリックでstaticfilesフォルダを作る

ターミナルで
pip install whitenoise
settings.py変更
①MIDDLEWARE = [にwhitenoise追加
'whitenoise.middleware.WhiteNoiseMiddleware',

②1番下に2行追加
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

エラーになるので→
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
#STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
静的ファイルを一箇所に集める
ターミナルで
python manage.py collectstatic

目次へ

GitHubへプッシュ

GitHubでnewレポジトリ作成

PaizaCloudターミナルで
git config --global user.name "*****"
git config --global user.email "******@*******"
git init
git remote set-url origin https://ghp_*******@github.com/******/****.git
またはgit remote add origin https://ghp_*******@github.com/******/****.git

git status

modifide:赤字で出てるファイルを全部
git add .
で追加

git statusで全部緑になったか確認

git commit -m "コメント"

git push origin master
うまくいかない場合や****が分からない場合、以下参照

目次へ

Heroku用に編集

GitHubで鉛筆マークをクリックすると編集できます。
編集後はCommit changesにコメントを書きCommit changesを押せば更新されます。

requirements.txt
内容
django
gunicorn
whitenoise

django-heroku ←追加

whitenoise使っているのに、ここに記載しなくてもうまくいっていたが
立ち上がらないアプリがでた。logを見るとh10のエラー発生。whitenoise追加で直った。
settings.py変更
変更前
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'pj_db',
        'USER': 'postgres',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}
変更後
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.postgresql_psycopg2',
#         'NAME': 'pj_db',
#         'USER': 'postgres',
#         'PASSWORD': 'password',
#         'HOST': 'localhost',
#         'PORT': '',
#     }
# }
import django_heroku
django_heroku.settings(locals())

Herokuにデプロイ

Herokuで
Create New Appでアプリの名前を付けたあと
settings→Config VarsのReveal Config Vars
DISABLE_COLLECTSTATICを1にしてaddします。

最初これをやらずにエラーになってエラーメッセージの中に
この設定をするように書いてあったのでやりました。
Heroku で自動的に collectstatic が実行されなくなります。
詳しくはcollectstatic の無効化

Herokuへデプロイします。やり方はこの記事を見てください。

2022/4/18現在というかこれから?Conect to GitHubの方法使えないようです。
herokuでgithubと接続すると「Item could not be retrieved: Internal Server Error」と出る

以下の方法でデプロイできました。
GitとHeroku CLIをパソコンにインストールして(2つで500Mぐらいの容量)
デプロイしたいGitHubのコードを自分のパソコンのGitにクローン
HerokuでCreate New Appします。
Deployment methodでHeroku Git Use Heroku CLIを選択、

ターミナルから(Anacondaが入ってる場合はAnacondaパワープロンプト)
cd クローンしたディレクトリ
heroku login
heroku git:remote -a アプリ名
git push heroku master

でデプロイできます。

簡単に書いておくと
Deployment methodをGitHub選択
search
GitHubのレポジトリが出てくるのでデプロイしたいものを選ぶ
Deploy Branchでデプロイできます。
デプロイが完了したらアプリを立ち上げる前に
データベースに項目を作って初期値を入れます。
右上のmore→run console
python manage.py migrate
以下コマンドでDjangoシェルを起動
python manage.py shell
from blog.models import *
cat = Category.objects.create(name="cat 1")
Category.objects.create(name="cat 2")
tag1 = Tag.objects.create(name="tag 1")
tag2 = Tag.objects.create(name="tag 2")
Tag.objects.create(name="tag 3")
post = Post()
post.title = "post 1"
post.body = "body 1"
post.category = cat
post.save()
post.tags.add(tag1)
post.tags.add(tag2)
post.save()
exit()

右上のOpen Appで起動できます。
完成品

セッションのほうが簡単

データを保存しておくのに上記のようにデータモデルを作って
データベースに保存するのは結構めんどうです。
一次的な保存になりますがセッションを使うと
かなり楽にデータベースにデータ保存ができます。
以下の記事を参考にしてください。
データを保持しておく方法

目次へ

MENTAやってます(ichige)

コメント

タイトルとURLをコピーしました