勝手に書評 「動かして学ぶ!Python Django開発入門 第2版」

 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)

PENTAX フィルムカメラプロジェクト ~発売へ向けて前進~

登り木 #164233

 いよいよ夏頃の発売に向けて、PENTAXのフィルムカメラ新製品プロジェクトが次のステップに入ったというアナウンスが公式からありました。いやぁ、楽しみですねぇ。第一弾として発売されるカメラの詳細も語られていました。以前から話に出ていたハーフサイズの手巻き上げコンパクトカメラだそうです。レンズは単焦点25mm(ハーフサイズなので35mm相当?)の高性能レンズのようです。今からどんな風に撮ろうかとわくわくしてきました。

 実のところ、50歳手前で写真に目覚めてからはほとんど35mmか中判でばかり撮っていて、ハーフサイズは小学生の頃に家にあったオリンパスのハーフサイズカメラ以来です。当時は、単に蒸気機関車を撮るための道具という感じでした。一眼レフカメラなんて贅沢品です!って家庭でしたから、ハーフサイズもくそも、最初からカメラはこういうものという感じで、構図が縦だとかそんなことは何もわかっていなかった年頃でした。そういうわけで、いざハーフサイズカメラを手にするとなると、さてどう撮る?って自問してイメージを膨らませていくうちにワクワクしてきているわけです。

続きを読む

定年後の確定申告(2年目)

e-tax

河口風景 #164602

 今年も確定申告の時期がやってきました。昨年は定年退職した年でしたので年末調整もしておらず、課税対象外とはいえ退職金もありましたので確定申告はマストでしたが、今年も私は確定申告します。申告自体はe-taxを使うのでやりやすいです。私の場合、在職中に何かのキャンペーンなのか税務署の方が職場に来てe-taxの受付?をやっていたので、その場で申し込み受付をしてくれました。なので、方式としては、マイナンバーカードを使うのではなく、ID・パスワード方式になります。マイナンバーカードも持ってますがPCからだと読み取りとかめんどいので、これでいいかなと。それ以来、毎年確定申告の時期になると、税務署からe-taxの案内が送られてきます。e-taxのいいところは、手続きがPC+ネットでできるのもそうですが、申告するしない等について税額シミュレーションにも使えるとこでしょうか。これ、私のような低収入定年退職者にとってはとても便利なのです。そう、所得控除枠いっぱいまで使う調整ができるからです。

続きを読む

私にとっての、映画と写真

灯台への道 #164535

 定年後、久しぶりに映画のはしごをした。もともと映画は大好きで、大学生の頃は年に200本ぐらい観てたし、就職してもしばらくは結構な本数を観ていた。とはいえ、年とともに観る本数は少なくなっていって、映画をほとんど観なくなったのは、50歳前に写真にハマりだしてからだと思う。その頃は、最近映画観なくなったよなぁ、ぐらいにしか思わず、たまには観なきゃなとか頭では思うんだけど、結局観ないことが10年以上続いていた。今思えば、まるで、映画をみることと写真を撮ることが入れ替わったかのようだった。

 今回観た映画は、アキ・カウリスマキの「枯れ葉」と、「コット、はじまりの夏」というアイルランド映画。私の好きなミニシアター系。先月は、「ゴジラ -1.0」を観たので、すでに去年見た本数を超えた。そして、おそらく今後は月に数本は見ると思う。定年退職してすぐの頃は、よぉーし映画も観るぞぉ、とか、気分的に思ってたりしたわけだけど、退職直後に少し観に行った後は、どういうわけか一向に映画館に足を運ぶことはなかったわけで。それがいきなり3本、しかも映画のはしごで2本観るとは、いったいどうしたことか?

続きを読む

男の料理教室 ~自分でごはんをつくる~

くぐり道 #163626

 定年退職前からこれだけは定年後の必須スキルだと考えていたものがあります。それは調理スキル。自分でごはんを作れるスキルです。その理由は、食費の節約、ではなく、ようやくごはんをつくる楽しさを享受できるぞ、と思っていたからです。現役時代は、若い頃も含めて、自炊する時期があったり外食中心になったりと、食生活は仕事の状況やら趣味への没頭具合に影響されていました。残業が多くて食って寝るだけの状態では、どうしても外食や弁当買ってきて食べるという食生活でしたし、趣味に入れ込んでいた時期も、そっちへ時間を使いたいので自炊するということもしませんでした。一方で、余裕がある時期には、一定期間自炊とかしていたりしました。自炊といってもインスタント食品を織り交ぜての簡単なものでしたが、自炊に限らずもともと自分で手を動かして何かをするというのがたまらなく好きな性格なので、仕方なく自炊なんてことはなく、できるなら自炊したいなぁと思っていました。そんなわけですから、定年後は絶対自分でごはんをつくるんだと思い望んでいたわけです。

続きを読む