Django学習メモ⑦

DjangoのHerokuデプロイでハマったところ

  • 500エラが出たので、一時的にsettings.pyのDEBUG設定をTrueにする。

django.db.utils.OperationalError: no such table: hoge

となっていたので、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とは

codezine.jp

  • 参考にしたstack Overflow

stackoverflow.com

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

解決した。

<参考にした記事>

www.monotalk.xyz

www.ganbaruyo.net

 

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)")

2. MySQLGUIを使ってコネクションを試みる f:id:ogady:20190218222039p:plain

 上と同じエラー。え~xamppで設定したパスワード無効になってる??
 それとも①で変更したののがまずかったのか?
 PC落ちたときになにかおかしくなったのか?

3. 最終手段、再インストール

 再度python manage.py migrateしうまく行ったけどすっきりしない。。。  なぜなのか。。。

結論

caching_sha2_passwordのせいではない。
・PCはちゃんとshutdownしよう。。。
 


参考にさせていただいた方たち↓ www.s-style.co.jp

qiita.com

Django学習メモ④

Userモデルの参照方法

DjangoデフォルトのUserモデルとのリレーションを行いたい場合にmodels.py上でどう参照するか

【意識すること】

  1. デフォルトのUserモデルを直接参照しない(後のカスタマイズが困難になる)
  2. カスタムユーザーモデルを作成して使用すること(最初はデフォルトをまんま継承しても良いので作っておく)
  3. AUTH_USER_MODEL参照とget_user_model()参照があるが、後者がベター
  4. カスタムユーザーモデルを作る前にmigrateしないこと(整合性の問題)

【settings.py サンプル】

#カスタムユーザーモデル定義
AUTH_USER_MODEL = 'app名.CustomUser'
 

 

※補足

・AUTH_USER_MODELで参照

 >settings.pyに書かれたAUTH_USER_MODELを参照する。stringで取ってくるため、views.pyから参照できない

 【models.py サンプル】

from django.db import models
from django.conf import settings
 
class WatchedList(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL
,on_delete=models.CASCADE)

 

・get_user_model()で参照

 >現在アクティブなAUTH_USER_MODELを参照しに行く(デフォルト or AUTH_USER_MODELに定義されているカスタムモデル)。classを参照する。

 【models.py サンプル】

from django.db import models
from django.contrib.auth import get_user_model
class WatchedList(models.Model):
user=models.ForeignKey(get_user_model(),on_delete=models.CASCADE)

 

↓公式ドキュメント

docs.djangoproject.com

 

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)

 

・その他マイグレーションコマンドのまとめ

qiita.com

 

Hrokuのその他のコマンド

vdeep.net

 

 

 

Django学習メモ②

Models.pyについて

フィールドの型

・関連付けてあり、わかりやすい

qiita.com

 

単純に一覧

qiita.com

 

多対多リレーション用テーブル

>>素晴らしいことに自動生成してくれるらしい

 

def __str__(self):とは

>>管理画面(admin画面)に表示される項目のこと、基本何でもいいらしい

 

farewell-work.hatenablog.com

 

気をつけること

リレーションを定義する際

  • 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/アプリ名