【感想】『速習 Django 3』【Python】
Djangoの最新版を扱った本
Python言語の代表的なフルスタックWebフレームワーク Django (ジャンゴ)を扱った本。おなじみ山田祥寛さんの手軽に読める速習シリーズです。
Djangoは3.0が2019年12月リリース、その後の最新Django3.1が2020年8月。本書は2020年6月刊行で最新のDjango3の基本機能を概観できる本となっています。
Djangoのバージョン1は2005年登場なのでけっこうな古株、実はRuby on Railsと同じ年なんですね。
Django: 締切のある完璧主義者のためのフレームワーク
- Djangoのキャッチフレーズが
The web framework for perfectionists with deadlines.
「締切のある完璧主義者のためのフレームワーク」なのが面白い。PHPのLaravelは「Web職人のための~」なのと対になりそうです。 - 実質MVCアーキテクチャなのですが、
Model-Tempalte-View
でMTV
となるのがややこしい…… - インストールはPythonツールのパッケージ管理ツール pip のコマンドラインから、新規プロジェクト(=Webアプリケーションひとつ)作成もコマンドラインからなのが今風。
- 開発用のサーバーも内蔵でコマンドから手軽に立ち上げられるのもNode.jsなど今風の技術ぽいです。
新規プロジェクトを作ると管理ツールのdjango-admin一式がダウンロード。そこからこの管理ツールを使って「アプリ」を複数作るのがちょっとややこしい。レイヤーごとでなく機能ごとで分割した1コンポーネントのような感じです。
Controller層がViewで、クラスでなく純粋な関数の集合なのが他のFWと違います。HTTPリクエストを受けてHTTPレスポンスを返し、最後の
render
関数で画面のテンプレート指定、一緒に設定する値を変数で返す。このへんは他のFWと同じです。- ルーティングもアプリごとに設定ファイルで設定、そして管理ツール側でも統合して読み込ませます。
- View層がTemplateで、
Django Template Language(DTL)
という、HTMLの中にPythonを書けるテンプレートエンジンを使います。変数は{{ msg }}
の様に二重カッコ。ここはフロントエンドのVue.jsのマスタッシュ記法みたいで面白い。
MVCのModel層に当たるModelクラス
- Model層は
Model
クラスでここはMVCアーキテクチャと同じ。O/Rマッパーが用意されています。 - 対応しているRDBはSQLite/MySQL/Postgres/Oracle。おっと、SQL Serverがない?!
- DB接続情報はプロジェクト全体の設定ファイルに記述。
- いちModelクラス=いちテーブル、プロパティ(メンバ変数)=カラム の対応は同じ。カラムごとの論理名やデータの型、初期値などのメタ情報は上につくアノテーションではなく、プロパティの宣言時に行います。このへんは他のFWとちょっと違います。
- DBのマイグレーションもコマンドから実行でき、このへんも他のFWと同様です。
- 自動的に作られる管理ツールから、Modelごとに画面のフォームからテストデータを1件1件作ったりもできます。ここも独特です。
MVCのView層に当たるTemplateの実装
- View層に当たる
Template
の詳細。for文の繰り返し以外にもけっこう様々なPythonの構文が書けます。 {{ xx.title|safe|upper }}
のようにパイプライン|
で区切りで複数、フィルターをかけたものを表示できます。このへんはVue.js 2の機能みたいであり、UNIX/Linuxぽくもあり面白いです。PythonはもともとUNIX文化圏と近いこともありそのへんがあるのかも。- ループの背景色色変え用のタグや、HTMLエスケープ無効化のタグ各種なども各種。
- Python構文的な各種タグは
{% ~ %}
で囲って書く。文字列操作や日付型変換など、結構豊富にあります。 - テンプレートを親子で継承してヘッダやフッタに活用したりも可能。
- 画像やCSSなど静的ファイルはアプリ毎に/staticフォルダに置くが、本番時はコマンド実行でプロジェクト全体のstaticフォルダにコピーされる方式。
- コメントは
{# ~ #}
で囲う。
Model開発の詳細
- DBにテストデータを登録できる「フィクスチャ」の機能。RailsやLaravelのマイグレーション機能は確か言語固有のコードで準備されたはずですが、このフィクスチャはJSON/YAML/XMLと各種できます。
- DBアクセスはアーキテクチャパターンのActiveRecordパターン方式。
get
やfilter, order_by
などPythonのメソッド各種でSQLを代用できます。 - 面白いのは「フィールドルックアップ」方式で、
{カラム名}_{より大きいなどの固定値}={比較する値}
のように、キーワード引数を与えることで条件が指定できる。複数与えてAND条件も可能。 - OR条件はQオブジェクトというものを使った記法があります。このへん慣れないとちょっと直感的でない気がします。
- 生のSQL文を書きたい場合は
raw
メソッドに文字列を与えて実行可能。 - テーブルにリレーションがある場合はModelクラスの定義時に指定すると、マイグレーションした後で認識されます。
MVCのController層にあたるView開発の詳細
- URLルーティングは
urls.py
にパスと与えるパラメーターを書いておくと、ビュー関数で受け取ってくれる。パラメーターのデフォルト値を決めたり範囲を決めたり、オプション様々。 - HTTPリクエストを受け取ったりリダイレクトしたり、こちらも機能様々。
- 簡単な例でよく出てくるビュー関数最後のrender関数は「ショートカット関数」といい、
Model-Tempalte-View
と複数のレイヤーにまたがる処理を抽象化して少ないコードで書けるようにしたもの。他にもいろいろあるそうです。 - レスポンスにCSVやJSONを与える方法もあり。
- クッキー、セッション管理を扱う方法も用意。セッションは予め設定ファイルの
settings.py
に指定が必要。デフォルトだと保存先はデータベース。これはちょっと意外でした。 - View層は純粋な関数のビュー関数で定義するが、
TemplateView
を継承したクラスで定義できるビュークラスというやり方もある。(これはメリットがよく分かりませんでした……) - ビュー関数呼び出しの前処理/後処理を独自に定義できるミドルウェアという機能あり。PHPのLaravelの持つMiddleware機能とよく似ています。
ja.wikipedia.org 名前の由来となったジャンゴ・ラインハルトさん。
フォーム開発
Form
クラスというものを継承したクラスを定義、Modelクラスと同じように画面の各項目をメンバ変数で定義。forms.XxxField
のように定義していくと、HTML上のテキストボックス/ラジオ/チェックボックス/リストボックスなどなどと対応します。このクラス内で型や最大値や最小値、バリデーション(検証、入力チェック)、エラーメッセージなどを指定しておきます。- このFormクラスをController層に当たるビュー関数の中でインスタンス生成、最後の処理のrender関数に引数で渡す。
- そしてView層にあたるテンプレートの中では
{{ form.as_p }}
のように記述すると、Form
クラス内のメンバがそれぞれHTMLに展開されて描画、メソッドに応じて<p>
タグなどで区切られて表示されます。
コード例にはなかったのですが、それぞれのHTML要素のstyle属性やclass属性はどう表現するのかなと思いました。見たところ公式ドキュメントにも記述がないようですね。サーバーサイドのPythonのクラス→実行時に展開されてHTML描画 の流れなので、Pythonは書けないデザイナーの人なんかとの協業が難しそうな気もしました。
- そしてFormクラスを使ったフォームでPOSTが飛んでくると、ビュー関数の中で
form.is_valid()
のようにしてバリデーションも実行可能。 - エラーメッセージは項目ごとに出るのでカスタマイズして画面の上の方に一覧表示などもできます。
- バリデーションルールの自作は、Formクラス内のメソッドとして定義できます。
このFormクラスでHTML部分をカバーする機能も独特ですが、バリデーションをこのクラスに書けるのはModel層のクラスに書くよりは自然でよいかなと思いました。
(エンプラ世界の業務システムだと、パターンが分岐する複雑なバリデーションというのが割とあるので…)
- 画面項目を定義するFormクラス、テーブルの項目を定義するModelクラスが同じ場合は、冗長さを避けるために
ModelForm
クラスというものにまとめられる。ModelFormを継承したクラスを作成、入れ子クラスで対応を記述。 - ビュー関数の中でこの
ModelForm
クラスを操作すると、Model層のコードを呼ばなくても処理が完結する。
このModelForm
という機能は他のフレームワーク群のスキャフォールディング機能と似たような感じを受けました。Controller層-Model層(DjangoではView-Model)をまたがって担うような感じですね。ただこれはレイヤーの境界線が曖昧になりそうで、アーキテクチャの観点からするとあまりよろしくない気もします。簡単な機能向けなのでしょうか。
まとめ:最新のDjango3が把握できる本
短いながらDjango3の最新情報が概観できる本でした。速習シリーズの表紙の写真はいつも作者さんが外出して撮ったものだそうですが、2020年6月刊行の本書はコロナで写真が尽きてしまったので素材を借用だそうです。
Django自体は大まかには他の言語の主要Webアプリケーションと似通っており機能も十分なのですが、細かいところになるとDjango独特っぽい部分があちこちにあるなという印象を持ちました。
ぱっと見まず違うのはModel-View-Controller
がModel-Tempalte-View
になっていること、プロジェクト(=1つのWebアプリケーション)の中を分割する「アプリ」という単位があること、管理ツールが最初からついていること。細かいところの違いは上に感想を述べてきた通りでしょうか。
なお、なぜ「MTV」アーキテクチャなのかは公式にも回答がありました。読むと、なるほど…でもそんなに変わらないんじゃ…?という気持ちです(笑)
自分的にはAI/機械学習がブームになって流行りだしたころにPyQさんなどでPythonの基礎を学んでその後に備えたのですが、結局仕事ではその後チャンスがなくそのままになっています。社内ではビッグデータ関連の案件でPython使っている部署もあるのだがなあ。
うーん、あのInstagramやUdemyで使われているフレームワークでもあるし、Djangoもどこかで試してみたいですね。
Django関連の本
2010年代後半、Python大注目が始まったころはPython自体や機械学習関係の本などは続々と出たものの、Webアプリケーション開発としてDjangoにフォーカスした本はあまりない状態が続いていました。2020年現在はだいぶ揃ってきていますね。
『動かして学ぶ! Python Django開発入門』がAmazonでも非常に評価が高い、機能が一通り解説してある本。2019年12月刊行、対応はDjango3でなく2.2(LTS)となっています。
『現場で使えるDjangoの教科書《基礎編》』『現場で使えるDjangoの教科書《実践編》』が、[akiyoko blog] でお馴染みの id:akiyoko こと横瀬 明仁さんの本。
元は2018年近辺の技術書典で出た技術同人誌でしたが、クオリティの高さからその後商業本になりました。プログラミング初心者でなくITエンジニア目線ならこの本でしょうか。こちらもDjango2.2対応。
boothでも入手できます。
ブログを拝見すると技術書典9では4冊目となる新刊『現場で使える Django 管理サイトのつくり方』を出されるそうです。技術同人誌らしい、特定テーマを深堀りした本ですね。
その他初心者向けの入門書だと2020年6月の『Python Django 3超入門』、2020年7月刊行の『Djangoのツボとコツがゼッタイにわかる本』があります。この2冊は何気に最新ですね。
- 作者:津耶乃, 掌田
- 発売日: 2020/06/13
- メディア: 単行本
- 作者:大橋 亮太
- 発売日: 2020/07/30
- メディア: 単行本