Django本3冊目です。いまだ学習中。いつになったらシステム開発に取り掛かれるのだろうか(笑)。まぁ、気長にやるしかないかって感じ。しかしながら、一応下調べして、初級→上級へ向かうつもりで書籍を選んでいるせいか、目下、3冊とも毛色の違った学習書で学習者としてはありがたいかぎりです。
まえおき
なわけで、実際に学習してみた感想なんかを書こうと思いますが、そんなに古い書籍ではないのですが、既にバージョンアップによって書籍に記載された通りではエラーが発生するようになっています。このブログの最後にこのあたりの回避方法を書いてますのでご参照ください。まぁ、書籍と同じバージョン環境で学習した方がいいかもしれませんが、学習段階では良くても、システム開発する段階になれば古いバージョンで進めるわけにはいかないでしょうから。
ざっとした感想
で、まずはこの書籍の感想ですが、Djangoが初めてだと別の初学者用の入門書で学習してから手にするべき本かと思います。私はネットのレビューとかで中級向けと書かれていたのを前提で学んだのでそこそこ学習が進みましたが、初学者にはやさしくないです。書籍の構成が2部構成になっていて、前半はDjangoについて網羅的に整理された形での説明になっています。なので、実際に開発作業をしながら学ぶのではなく、いわゆる座学形式です。まったく初めての人には、???の連続でしょうw。逆に、初級学習を終えた人には復習ともなりありがたい形式です。そして、後半で実践形式でシステム開発を学んでいきます。ただ、書籍のボリューム上、手取り足取りの説明がなされているわけではないです。また、記述しては動かすというわけでもなく、かなり記述を進めてから動作を確認することになっていて、記述間違いがあるとそれを探すのに手間取ります。がしかし、こういうミスを探すのも学習のうちでしょう。という意味でまさに中級者向けです。
PyCharmとVS Code
記述間違いを探すという点では、実はそれほど苦労しなくてもよかったです。というのも、この書籍では開発ツールとしてPyCharmを使っているからです。Python、Django専用の統合開発環境ならではのサポート機能がとても充実しています。まじで、これで書いていると、間違いもどんどん指摘してくれます。VS Codeも拡張パッケージを入れることで同様の機能がありましたが、やはり専用ツールは違います。感激レベルです。なので、困ったことに、PycharmかVS Codeかという悩ましい問題が発生してしまいます。Python、DjangoだけならPyCharmでしょうけど、その他の言語も併用するとなるとVS Codeは手放せない気がします。要するに、どっちも使いたい!です。ということで、私は、最初の新規構築はPyCharmを使って、構築後の部分修正とか改築はVS Codeを使う使い分けで、両方使いたい欲求を満たそうかと思っています。うまくいけばいいのですが…。なわけで、PyCharmの入門書的な価値もこの本にはあるかと思います。
ユーザー認証と開発テスト
後半のシステム開発学習部分はかなり実践的だと感じました。ユーザー認証について、いままで学んできた学習書では、Djangoの管理ツールに付属の認証環境をそのまま使うパターンでしたが、この本では専用の認証環境を作って使います。これは、以前から私が気になっていた部分なので、ちゃんと認証環境の作り方を学べたのは有意義でした。また、システムテストについてもページが割かれています。テストコードを書いてテストする方法が学べます。少しでもシステム開発や構築に関係した人ならわかると思いますが、システムテストはチョー重要です。まぁ、こうやってやるんだぁ、レベルではありますが、学べてありがたかったです。あと、これは補足ですが、この書籍ではデータベースにPostgreSQLを使用しています。Djangoの場合、データベース制御も内部に組み込まれているので、使用するデータベースの違いはあまり重要ではないですが、知っておいて損はないかと思います。
Djangoでの独自コマンド実行方法
以前、Herokuをデプロイするやり方を書いたときに、Herokuではssh対応が有料なので、普通ならssh経由でスーパーユーザーを作成するところを、Djangoの中のPythonプログラムとして実装する方法を転記してました。その時は、単にコードを転記しただけでしたが、そのあたりの説明が本書には記載されていました。Djangoのモデル経由でのバックアッププログラムの実装という例でしたが、いろいろ応用できそうでありがたいです。私の場合は、データベースの管理はSQLを書いて行いたい方ですが、この独自コマンドを作る方法を使うとSQLを書かずにデータベースの管理もできるわけで、クラウド上などで利用する場合は有利でしょう。
クラウド上での本番運用
最後の2割ほどは、クラウドで運用するにあたってのノウハウが書かれています。この書籍ではAWS上に本番環境を構築する想定です。理由は、AWSの無料枠を使う前提かと思います。私の場合、AWSは本番移行前のクラウド運用開発環境として使うつもりでしたので、これはこれで有益な情報でした。ただ、他のVPSの株主優待無料枠が残っていたので、今回はAWSではなく普通にVPS上で構築しました。なので、AWSに関する部分はとばして作業しました。AWSの方が癖があるので、このやり方でなんら問題はありませんでした。独自ドメインへの対応やHTTPS化についても書かれていて有益でした。全体的に有益な情報が詰まっている本だと思います。今後も手元に置いて参照するつもりです。中級向けの学習書で手取り足取りというわけにはいきませんので、うまく動かないところは自分で調べる必要があり、そのための基礎知識は必要になります。
Django本3冊を学んでみて
開発環境を構築しての開発から準本番環境の構築と運用まで、一通りできそうな段階に来たかなとは思います。いよいよ、ちょっとしたアプリを作ってみようかと思ってます。とはいえ、この学習本でOJTってのも結構楽しいので、今後も他の書籍を少しずつでも学んでいくつもりです。現在は、きちんとした開発環境をどう作ろうかと思案してます。Windows上で作るか、Linux環境(仮想環境も含めて)で作るかとか、PycharmとVSCodeとか、その他ツールなどなど、結構考えることが多いです。あと、以前も書きましたが、gitはもっとつっこんで学習しないといけないなと感じています。gitでのバージョン管理さえしっかりしていれば、まぁ、Windowsだろうが Linuxだろうが、どちらでも楽しめるでしょうから。今までインフラ系の仕事が中心だったので、このあたりの知識が決定的に不足しているんですよねぇ。ま、やることモリモリでうれしい限りですw。
修正対応箇所
以下は書籍の通りではうまく動かなかったところの対処です。Djangoのパッケージとか最新バージョンを入れちゃってるので、その関係かもしれません。エラーが出たのは、「Chapter10-11 django-allauth用のマイグレーションを行う」でmakemigrationsコマンドを走らせた時です。以下のエラーが出て異常終了しました。
django.core.exceptions.ImproperlyConfigured: allauth.account.middleware.AccountMiddleware must be added to settings.MIDDLEWARE プロセスは終了コード 1 で終了しました
解決策は、エラーにあるとおり、settings_common.pyのMIDDLEWAREの項目にallauth.account.middleware.AccountMiddlewareを追加しただけです。
settings_common.pyから抜粋 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'allauth.account.middleware.AccountMiddleware', ]
続いて、Seleniumによるテスト実行時に「executable_path」は想定外とかいうエラーが出ました。バージョンアップによる仕様変更っぽいです。一応、以下のようにService経由での記述に変えたら通りました。
from django.test import LiveServerTestCase from django.urls import reverse_lazy from selenium.webdriver.chrome.webdriver import WebDriver from selenium.webdriver.chrome.service import Service # Serviceをインポートしておく class TestLogin(LiveServerTestCase): @classmethod def setUpClass(cls): super().setUpClass() service = Service(executable_path='<chromedriver.exeの存在するpathを記述>') # Sevice経由でexecutable_pathを設定 cls.selenium = WebDriver(service=service) # serviceに指定
続いて「find_element_by_name」と「find_element_by_class_name」もSeleniumバージョン4では使えなくなっていました。最終的に、tests.pyを以下のように書き換えました。
from django.test import LiveServerTestCase from django.urls import reverse_lazy from selenium.webdriver.chrome.webdriver import WebDriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By # Byをインポート class TestLogin(LiveServerTestCase): @classmethod def setUpClass(cls): super().setUpClass() service = Service(executable_path='C:/Users/ユーザー名/chromedriver-win64/chromedriver.exe') cls.selenium = WebDriver(service=service) @classmethod def tearDownClass(cls): cls.selenium.quit() super().tearDownClass() def test_login(self): # ログインページを開く self.selenium.get('http://localhost:8000' + str(reverse_lazy('account_login'))) # ログイン username_input = self.selenium.find_element(By.NAME,"login") username_input.send_keys('<テストユーザーのメールアドレス>') password_input = self.selenium.find_element(By.NAME, "password") password_input.send_keys('<テストユーザーのパスワード>') self.selenium.find_element(By.CLASS_NAME, 'btn').click() # ページタイトルの検証 self.assertEquals('日記一覧|Private Diary', self.selenium.title)