Django学習メモ⑦
DjangoのHerokuデプロイでハマったところ
500エラが出たので、一時的にsettings.pyのDEBUG設定をTrueにする。
となっていたので、migrateがうまく行っていない可能性。
sqlite3の仕様が原因
全く仕組みを知らず、MySQLやPostgreと同じようなものと思っていたが、 SQLiteは、サーバー型ではなく、データをファイル形式で保存するとのこと。 Heroku dynoのファイルシステムは永続的ではなく、dyno間の共有もないため、 migrateを実行すると、Herokuは新しいdynoを起動し、移行を実行してからdynoとデータベースを削除してしまうらしい。
解消方法
db.sqlite3(データファイル)をgit管理していなかったため、リモートリポジトリにpushされていなかった。 そこで.gitignoreを編集する。
<blog>
__pycache__
staticfiles
local_settings.py
db.sqlite3
*.py[co]
settings.json
からdb.sqlite3を削除
<blog>
__pycache__
staticfiles
local_settings.py
*.py[co]
settings.json
無事うまく動作した。
【補足1】sqliteのメリット・デメリット
- メリット
- クラウドサーバーを用いるとき、他者とDBサーバーを食い合わないため、高速
- データ型の概念がない
- デメリット
- パスワード設定がない
- 頻繁に不特定多数がデータベースに書き込むような処理は苦手
#【補足2】Heroku Dynoとは
参考にしたstack Overflow
Django学習メモ⑥
Djangoのマイグレーションのハマりどころ
マイグレーションをしようとしたらうまく行かず、 テーブルが作成されなかった。
以下その時のターミナル
$python manage.py makemigrations No changes detected
$python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: No migrations to apply.
どうやら、makemigrationsを実行するときアプリ名を指定するのがあるべき姿とのこと。
$python manage.py makemigrations anicolle Migrations for 'anicolle': anicolle\migrations\0001_initial.py - Create model Act - Create model Anime - Create model Comment - Create model Directer - Create model Genre - Create model WatchedList - Create model WishList - Add field directer to anime - Add field genre to anime - Add field anime to act
$python manage.py migrate Operations to perform: Apply all migrations: admin, anicolle, auth, contenttypes, sessions Running migrations: Applying anicolle.0001_initial... OK
解決した。
<参考にした記事>
Django学習メモ⑤ ~MySQLでハマった~
家に帰ったらPCが落ちていて、起動後Anacondaローカル環境で以下エラーが発生
$python manage.py runserver ↓ $RuntimeError: cryptography is required for sha256_password or caching_sha2_password
昨日までは普通に起動できていたのに、、、
調べてみた
どうやら認証プラグインがMySQL8.0より新たに追加された caching_sha2_password に変更されているとのことで、パスワードに暗号化が必要だと言われているっぽい。
とりあえずいろいろ試してみた。
1. 昔の認証プラグインのデフォルト(mysql_native_password)に戻してみる
mysql> SELECT host, user, plugin FROM mysql.user; mysql> ALTER USER 'root'@"localhost" IDENTIFIED WITH mysql_native_password BY '{password}'
結果:無理だった。以下エラーが発生
django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
上と同じエラー。え~xamppで設定したパスワード無効になってる??
それとも①で変更したののがまずかったのか?
PC落ちたときになにかおかしくなったのか?
3. 最終手段、再インストール
再度python manage.py migrate
しうまく行ったけどすっきりしない。。。
なぜなのか。。。
結論
・caching_sha2_password
のせいではない。
・PCはちゃんとshutdownしよう。。。
参考にさせていただいた方たち↓ www.s-style.co.jp
Django学習メモ④
Userモデルの参照方法
DjangoデフォルトのUserモデルとのリレーションを行いたい場合にmodels.py上でどう参照するか
【意識すること】
- デフォルトのUserモデルを直接参照しない(後のカスタマイズが困難になる)
- カスタムユーザーモデルを作成して使用すること(最初はデフォルトをまんま継承しても良いので作っておく)
- AUTH_USER_MODEL参照とget_user_model()参照があるが、後者がベター
- カスタムユーザーモデルを作る前にmigrateしないこと(整合性の問題)
【settings.py サンプル】
※補足
・AUTH_USER_MODELで参照
>settings.pyに書かれたAUTH_USER_MODELを参照する。stringで取ってくるため、views.pyから参照できない
【models.py サンプル】
・get_user_model()で参照
>現在アクティブなAUTH_USER_MODELを参照しに行く(デフォルト or AUTH_USER_MODELに定義されているカスタムモデル)。classを参照する。
【models.py サンプル】
↓公式ドキュメント
Django学習メモ③ ~Herokuについて~
本番環境(heroku)でのmigrate
・herokuにログイン(HerokuとPCの紐付け)
ターミナルにて
$ heroku login
※$ heroku logoutで紐付解除
・migrate
$ heroku run python manage.py migrate -a アプリ名
・superuser作成
$ heroku run python manage.py createsuperuser -a アプリ名
要は
$ heroku run pythonコマンド -a アプリ名
でpythonコマンドを実行できる。(-aはオプション、--app)
・その他マイグレーションコマンドのまとめ
Hrokuのその他のコマンド
Django学習メモ②
Models.pyについて
フィールドの型
・関連付けてあり、わかりやすい
単純に一覧
多対多のリレーション用テーブル
>>素晴らしいことに自動生成してくれるらしい
def __str__(self):とは
>>管理画面(admin画面)に表示される項目のこと、基本何でもいいらしい
気をつけること
リレーションを定義する際
- OneToOneField(1対1)
- ManyToManyField(多対多)
- ForeignKey(1対多)
は、on_deleteオプションがマスト(DB整合性問題)
文字列型のカラムを設定するとき
max_lengthの指定がマスト
Django学習メモ①
全体構成の把握
各.pyの役割
- urls.py→これはアクセスされたurlとview.py内のメソッドを紐づけるため
- views.py→url.pyでルーティングされた後に処理リクエスト、レスポンスの処理を行う
- models.py→データベースに対するアクセスを行うCRUD処理とテーブル定義を記載
- manage.py→これが起点、python manage.py runserverコマンドを実行することでアプリを起動する。
- settings.py→プロジェクト全体の設定、プロジェクト内のアプリケーションとか登録する
その他のファイルはまた別の機会にまとめる
ローカル実行と本番実行の時の違い
※備忘
アクセスするURLの違い
heroku(本番)
herokuサーバアドレス/アプリ名
cloud9
$ cd プロジェクトディレクトリ
$ source 環境名/bin/activate
$ cd ~/environment/プロジェクトディレクトリ
$ python manage.py runserver 8080
※djangoは基本8000ポートだが、cloud9が8080,8081等を指定しているため、コマンドで指定する
-URL-
/cloud9用ec2のアドレス:8080/アプリ名
anaconda(OS:Windows)
$ activate 環境名
$ cd /プロジェクトディレクトリ
$ python manage.py runserver
-URL-
/127.0.0.1:8000/アプリ名