akiyoko です。
今回は、4月22日の「技術書典4」 *1 で頒布した人生初の技術同人誌 『現場で使える 基礎 Django』 の概要と読みどころについて解説します。
現在、オンラインショップの「BOOTH」にて、増刷した紙の本が 販売中です。*2 完売しました!
《2018/8/17 追記》
BOOTH で販売していた技術書典4バージョンの「現場で使える 基礎 Django」(紙の本)はおかげさまで完売いたしました。そしてこのたび、36ページの加筆(本文144⇒180ページ)、Django 2.1 対応などの改訂をおこなった「現場で使える Django の教科書《基礎編》」を Kindle Direct Publishing で出版することになりました。電子版と紙の本を予定しています。
- 概要
- 読みどころ
- 第1章: はじめに
- 第2章: アーキテクチャ
- 第3章: プロジェクト構成
- 第4章: URL ディスパッチャと URLconf
- 第5章: ビュー(View)
- 第6章: モデル(Model)
- 第7章: テンプレート(Template)
- 第8章: フォーム(Form)
- 第9章: ミドルウェア(Middleware)
- 第10章: 設定オブジェクトと設定ファイル(settings.py)
- 第11章: データベースのマイグレーション
- 第12章: 開発用 Web サーバ(runserver)を起動する
- 第13章: 管理サイト(Django Admin)
- 第14章: 便利な Django パッケージを使おう
- 第15章: サンプル実装
- 付録
- おわりに
概要
どんな本?
この本は、B5サイズ・148ページの 本格的な Django 解説書 です。
Django を仕事の現場で6年ほど使っている私が、日本語で書かれた書籍が少なくてずっと困っていたので自ら書きました。「現場でこんな本があったらなぁ」という想いで書いたので、仕事で使っているあなたにぴったりな本に仕上がっている はずです。
表紙はこんな感じです。
電車の中でも読めるようなものがよいと思い、派手さは極力抑えるようにしました。
いわゆる「技術系同人誌」というジャンルの自費出版本になりますが、いたって真面目な技術解説書です。
表紙も含めて基本的に一人で作り上げました。レビューには Django 界隈から有志の方二人と、同僚二人に協力していただきました。スタートから入稿まで二ヶ月ほどで書きましたが、執筆にかかった時間は優に300時間を超えていると思います *3。
内容は?
目次はこのようになっています(クリックで拡大します)。
この本は、サンプルプロジェクトを実装ながら(読者によっては実際に手を動かしながら)技術要素を順番に説明していくような、いわゆるチュートリアル本ではありません。Django の全体像から構成要素の詳細まで、基本動作やハマりやすいポイントについて幅広く解説した本です。読者の方々に「Django って意外と簡単だな」と感じていただけることを目指して、基礎から詳しく丁寧に解説しています。
本書の構成としては、第 3 章までで Django の全体像や重要な概念の説明をおこない、 第 4 章以降でそれぞれの構成要素の説明をしながら、私の知見や経験から得たベストプ ラクティスについても紹介しています。
対象読者
本書の対象読者としては、
- Python の文法はある程度分かるけど Django は初めてという初心者の方
- Django を始めてみたけど今いちコツが掴めないという初級者の方
- Django のベストプラクティスを学びたいと考えている中級者の方
を想定しています。特に、
- Django の日本語書籍が無くて困っている方
- Django で一度挫折したことがある方
にピッタリな再入門書にもなっていると思います。
しかしながら、Webアプリケーション開発の経験がまるっきり無いという方には多少難しい内容になっているかもしれません。
本の評判
日本語のまとまった情報が少ないということでやはりニーズが高かったのでしょうか、技術書典4 では(強気で刷った)300部が3時間ほどで完売してしまいました。当日は初参加の上に予想をはるかに超えた売れ行きにてんてこ舞いで、全く余裕がありませんでした。
Twitter に上がっていた Django 本の感想を勝手にピックアップさせていただきました。おおむね好評のようで、ほっとしました。
技術書典で買って今半分ぐらいまで読んだんだけど、これはヤバイ。ヤバいものを見つけたという感じ。クオリティがあまりにもあまりにも高すぎる。やべぇ。Django情報量がなぁ…とか思ってたけどこれあれば全く問題ないと思わせるほど。
— くしゃみ (@kusyami_p) 2018年4月22日
ヤバい(語彙力がヤバい)
現場で使える 基礎 Django akiyoko さん
— 515ひかる (@515hikaru) 2018年4月22日
1年前に欲しかった……と思いながら見本を見て購入。Djangoって本当にいいフレームワークだと思うんですよ。
いつも雰囲気で使ってるMiddlewareや、あとわたしの好きなFormオブジェクトの解説も充実。すごくいいです。
この本は昨日買って読んだけど良かった。これとアイスクリームの本を読めばDjangoで実用的なものが作れるかと思う。 https://t.co/UFWNx1vm61
— okazaki jun (@dario_okazaki) 2018年4月23日
技術書典4で買ったものいくつかあるけど、その場で見かけてふらっと買った「現場で使える基礎Django」がなかなかの当たりでした https://t.co/kCS8vmEGmZ
— Yoshiaki NAKANISHI (@chun_ryo) 2018年4月24日
#技術書典4 で購入したDjango本、ものすごいクオリティ。しかも本格的に書き始めたのが2月下旬だと。。。
— R.Miyaji (@try0forpin) 2018年4月24日
サークル詳細 | あきよこブログ | 技術書典 https://t.co/bXHkd2SD3E
— hassaku (@hassaku_63) 2018年4月30日
今読み進めているけど技術書典4において1,2を争うレベルで有用な戦利品だった。PythonでWものづくり(Webアプリ開発)したいと思っている人は皆読めばいいと思う
本を買っていただいた上に感想までブログに書いてくださった心優しい方も何人かいらっしゃいました。本当にありがとうございます。こちらも勝手に貼り付けさせていただきます。
匿名の読後アンケートフォーム を用意して感想を聞かせていただいたのですが(現在も絶賛募集しているので是非とも感想をお願いします)、その結果もおおむね良かったようです。改善すべき点としてご指摘いただいた部分については(すでに v 1.0.1 で対応したものもありますが)今後の改訂や補足ブログのネタにさせていただきたいと思います。
読みどころ
章ごとの簡単な解説をしながら、本書の読みどころについて書いていきます。
第1章: はじめに
1.1 なぜ今 Django なのか? 1.2 本書について 1.3 動作環境と各種バージョン 1.4 まとめ
短く書きたかったのですが、勢い余って長くなってしまった序章。
機械学習などで Python を使う人が増えているので、Django もどんどん盛り上がってくるよねという書き出しだったのですが、実際、私がよく参加させていただいている fin-py でも「Django の勉強がしたい」という声がちらほら聞こえていましたし、最近では日本では初めての DjangoCongress が今年5月に開催されるなど、本格的な盛り上がりを感じます。
Django に少し詳しい人なら気になるのが、Django のバージョンでしょう。結論から言えば、仕事で使うなら今はまだ「1.11 LTS」、趣味で使うなら「2系」を使えばよいと考えています。この本では仕事の現場にフォーカスしたので「1.11」推しとなっていますが、実際には 1.11 と 2.0 はそんなに違いがありません(Python 2 のサポートが切られたことを除いて)。これについては追々、補足のブロク記事で解説したいと思います。
(2018/6/15 追記)
補講記事をアップしました。
akiyoko.hatenablog.jp
Python は 3.5系で動作確認しましたが、これは 3.6系でも特に問題ないはずです。改訂するのであれば、3.6系を前提に書きたいと考えています。
第2章: アーキテクチャ
2.1 全体像 2.2 MTVフレームワークとは? 2.3 まとめ
何事にもまずは全体像から掴んだ方が理解しやすいので、大枠から解説。ビューやフォーム、モデルなどの構成要素(コンポーネント)がどのように連携しながら動作しているのかを、図を見ながらざっくりと理解することができます。
第3章: プロジェクト構成
3.1 プロジェクトとアプリケーション 3.2 django-admin.py と manage.py 3.3 よくあるプロジェクト構成 3.4 ベストプラクティス1: 分かりやすいプロジェクト構成 3.5 まとめ
本章の読みどころは、startproject コマンドや startapp コマンドを使って自動生成されたファイルの説明と、分かりやすいプロジェクト構成についてです。 *4
第4章: URL ディスパッチャと URLconf
4.1 概要 4.2 URLconfの書き方 4.3 ベストプラクティス2: アプリケーションごとに urls.py を配置する 4.4 まとめ
リクエストをビュー関数に振り分ける「URLディスパッチャ」と、リクエスト URLとビュー関数をマッピングしている「URLconf」(URL設定)についての解説です。URLconf については 2系で書き方が新しくなる(ただし 1系の書き方も継続して使える)ので、そちらは補足ブログで追記したいと考えています。
第5章: ビュー(View)
5.1 概要 5.2 ビュー関数の書き方(関数ベース vs クラスベース) 5.3 全ての基本となる基本汎用ビュー 5.4 シンプルでよく使う基本汎用ビュー 5.5 さまざまな用途に特化した汎用ビュー 5.6 ログイン・ログアウトについて 5.7 まとめ
本書では、関数ベースのビューについてはほとんど説明しておらず、クラスベースビューを中心に解説しています。クラスベースビューを使う理由やメリットについてももちろん書いていますし、デメリットである継承の複雑さやオーバーライドできるメソッドや変数がどうなっているかについては、解決のヒントを提示しています。
この章に書いた、Django でのログイン・ログアウト処理は実はややこしいのですが、よく分かっていなかった人もこれを読めばだいぶスッキリすると思います。
第6章: モデル(Model)
6.1 概要 6.2 モデルクラスの書き方 6.3 「一対一」「多対一」「多対多」リレーションはどう定義するか? 6.4 よく使われるUserモデル 6.5 モデルマネージャとクエリセット 6.6 単体のオブジェクトを取得する 6.7 複数のオブジェクトを取得する 6.8 単体のオブジェクトを保存・更新・削除する 6.9 ベストプラクティス3: Userモデルを拡張する 6.10 ベストプラクティス4: 発行されるクエリを確認する 6.11 ベストプラクティス5: select_related / prefetch_related でクエリ本数を減らす 6.12 まとめ
便利だけど実はいろいろとややこしい、そんなモデルを分かりやすく解説しています。
この章は本書で最もページ数を割いたトピックですが、なぜそんなにページ数を割いたかというと、個人的にモデルが Django 最強の武器(そして最も厄介な諸刃の剣)だと考えているからです。Django を使う場合は DB を使わないことは少ないと思いますので、モデルの仕組みを理解するのは必須でしょう。
モデルの設計で重要な「一対一」「多対一」「多対多」のリレーションについては、基本から説明しています。分かりにくいモデルマネージャとクエリセット、遅延評価、関連先モデルの JOIN についても詳しく説明しています。発展編として、あまり知られていない(と思われる)「select_related」「prefetch_related」の使いどころや実際に発行される SQL 文を確認する方法についても解説しています。
またこの章では、Django の User モデルについても解説。ややこしい継承関係や User モデルのカスタマイズ方法についても取り上げています。
第7章: テンプレート(Template)
7.1 概要 7.2 変数表示 7.3 フィルタ 7.4 テンプレートタグ 7.5 ベストプラクティス6: ベーステンプレートを用意する 7.6 まとめ
Django がデフォルトのテンプレートエンジンとして利用している「DTL(Django Template Language)」の記法について解説(Jinja2 については解説していません)。数あるフィルタやテンプレートタグの中からよく使うものをピックアップして紹介しています。
第8章: フォーム(Form)
8.1 概要 8.2 バリデーションの仕組み 8.3 フォームクラスの書き方 8.4 ビューやテンプレートからフォームを利用する方法 8.5 CSRF対策について 8.6 ベストプラクティス7: こんなときは ModelForm を継承しよう 8.7 まとめ
ユーザーの入力データを保持するためのフォームですが、やはりキモとなるのはバリデーションですよね。フォームでは is_valid() を起点としてさまざまなメソッドが順番に呼ばれますが、そのややこしいバリデーションのフローを図を使って分かりやすく解説しています。また、さらにややこしい ModelForm についても何とか一枚の図にまとめてみました。必見です。
エラーに悩まされた方も多いであろう、CSRF対策(csrf_token)についてもこの章で解説しています。
第9章: ミドルウェア(Middleware)
9.1 概要 9.2 主なミドルウェアの役割 9.3 ミドルウェアの書き方 9.4 ベストプラクティス8: メッセージフレームワークを使う 9.5 まとめ
Django のミドルウェア、何となく使ってませんか?
見逃されがちなミドルウェアですが、実は縁の下の力持ちなんですよね。ということで、新規プロジェクト作成時にデフォルトで設定されるミドルウェアの役割や必要性などについて解説しています。
また、便利なメッセージフレームワーク(いわゆるフラッシュメッセージ)については、注意点やちょっとした TIPS とともにベストプラクティスとして解説しています。
あと、1.11 から導入された ミドルウェアの新しい書き方 についても言及しています。django.utils.deprecation.MiddlewareMixin を継承する書き方は非推奨にマークされているので、要注意です。
ミドルウェアについてここまできちんと書いている Django の書籍は、おそらくこれまで無かったと思います。
第10章: 設定オブジェクトと設定ファイル(settings.py)
10.1 概要 10.2 インストールするアプリケーション一覧 10.3 デバッグ設定 10.4 静的ファイルパス関連の設定 10.5 ロギングの設定 10.6 その他の重要な設定 10.7 ベストプラクティス9: 個人の開発環境の設定は local_settings.py に書く 10.8 ベストプラクティス10: シークレットな変数は .env ファイルに書く 10.9 まとめ
実はこの章が本書の一番のウリかもしれません。匿名の読後アンケート でも最も評価が高かった章の一つでもあります。
Django でつまづくパターンとして、settings.py によく分からない設定がたくさん羅列してあるのを見たり、runserver を動かしたときに何だか分からないエラーが出たりして途方に暮れる、というのがあるのではないでしょうか。あるいは、「この設定って何が正解?」「動いたけどこのままでいいんだろうか?」と悩みながら何となく使っているのではないでしょうか。
また、
- 「INSTALLED_APPS」にはアプリケーション名を書くべきか、それとも apps.py の AppConfig のサブクラスを書くべき?
- 静的ファイルパス関連の「STATIC_URL」「STATIC_ROOT」「STATICFILES_DIRS」の違いは一体何なの?
- 「SECRET_KEY」や「ALLOWED_HOSTS」って何に使うの?
- 「LOGGING」は具体的にどう設定すればいいの?
など疑問は尽きないと思います。この章ではこれらの疑問に全てお答えしています。
そして現場で利用するなら必須のベストプラクティスとして、本番用の settings.py と個人開発用のものを分けるための方法や、シークレットな変数値を環境変数に分離する方法などについても解説しています。
第11章: データベースのマイグレーション
11.1 概要 11.2 マイグレーションコマンドについて 11.3 まとめ
マイグレーションについての説明は短め。実際の運用ではもう少しディープな理解が必要かもしれませんが、紙面の都合で割愛しました。
第12章: 開発用 Web サーバ(runserver)を起動する
12.1 概要 12.2 runserver コマンドについて 12.3 まとめ
開発用の Web サーバ(runserver)の特徴や使い方、Docker で利用する場合の注意点について書きました。こちらも割とシンプルにまとめています。
第13章: 管理サイト(Django Admin)
13.1 概要 13.2 モデルの登録方法 13.3 一部機能のカスタマイズ方法 13.4 利用条件 13.5 使い方 13.6 まとめ
Django の便利な点として、この管理サイト(Django Admin)が挙げられるかと思います。ログインできるユーザーや権限などの利用条件、一部機能のカスタマイズ方法など、少し詳しめに解説しています。
第14章: 便利な Django パッケージを使おう
14.1 概要 14.2 DRY系パッケージ 14.3 開発補助系パッケージ 14.4 まとめ
実際に開発する際にほぼ必須の知識になってくる「Django パッケージ」について、選定のコツや私のオススメするパッケージをいくつか紹介しています。
第15章: サンプル実装
「本のオンラインショップ」をテーマに、ログイン・ログアウトまわりを中心に実装したサンプルプロジェクトです。本書で説明したことをベースにしたサンプル実装になっており、コードには日本語の説明をなるべく多く書きました。紙面の都合でコードの掲載はカットし、その代わりにソースコードのURLを載せています。
付録
付録A: macOS における Django 開発環境の構築方法 付録B: Docker でラクラク開発 付録C: 覚えておきたい Django 管理コマンド 10 選
ローカルPC への Python の導入方法については、技術書典バージョンでは Anaconda を使った方法について書いていましたが、読者の方からの指摘を受けて、「v1.0.1」(BOOTH での6月以降販売分)ではよりシンプルな方法に修正しています。また、Django の開発環境についても PyCharm をベースにしたものに書き直しました。
あと、自分でも最近取り入れて良かったと思っているのが「Docker でラクラク開発」です。ローカルPCの環境を汚すことがなく、要らなくなったらすぐに環境を作り直せるので、開発や検証が容易になります。
おわりに
「現場で使える 基礎 Django」ってどういう本なの? 買うべきなの? と悩んでいる人向けに、この本はどういう本なのか、誰にピッタリな本なのかを解説してみました。
仕事の現場で使っている人を主なターゲットにしていますが、仕事ではなく趣味で使ってるという方や、2系の情報が知りたいという方にも有益な情報がたくさん含まれているはずですので、是非ともお手にとっていただければと思います。よろしくお願いします。
《販売サイトはこちら》
おまけ
DjangoCongressJP 2018 の一日目に一般参加したのですが、偶然にも LT で発表させていただく機会を得て、「Django の同人誌を書いた話」というテーマで登壇しました。
意外と小心者なので、テンパって噛みまくりでお聞き苦しかったかと思います。その節は大変失礼いたしました。
*1:春と秋の年二回ずつ開催される、技術者による技術者のための技術系同人誌の販売イベント。今回は4回目の実施となり、参加者は6,000人を超えました。 https://techbookfest.org/event/tbf04
*2:技術書典4で頒布したものから少しだけ改訂した「v1.0.1」バージョンになります。ページ数は同じです。
*3:多忙な時期とも重なり、本当に死ぬほど疲れました。。
*4:しかしながら、これがベストか?については異論あると思います。もう少し複雑になった場合の本格的なプロジェクト構成について、もし続編を書くのであればこのあたりも補足してみたいと考えています。