スポンサーリンク
概要
「実践Django Pythonによる本格Webアプリケーション開発」を読んだので感想等を書こうと思います。
Djangoに関しての入門書ですが、けっこう細かい部分や深い部分まで解説されていて、入門が終わったDjango経験者が読むと参考になりそうな書籍です。
技術書のセールとおすすめ書籍を紹介しています。合わせてご覧ください。
スポンサーリンク
書籍概要
どんな本?
現場で役立つ実践的なノウハウを徹底解説
【Djangoとは】
Djangoは、Pythonで人気のあるフルスタックWebフレームワークです。
強力なテンプレートエンジンやO/Rマッパーに加え、ユーザー認証や国際化、管理画面など、Webアプリケーション開発で必要になるありとあらゆる機能を高い柔軟性で提供し、高速なWebアプリケーション開発を可能にします。【本書のポイント】
本書は、業務で必ず役に立つ実践的なDjangoの解説書です。モデルやビュー、テンプレートといった基本コンポーネントの解説はもちろん、Djangoの実践的なテストテクニック、ユーザーモデルのカスタマイズ方法、認証処理のベストプラクティスなど、Web開発において必ず知っておくべき内容を幅広く取り上げました。
また実際に業務でWebアプリケーション開発に取り組む際には、これらの理解だけでは不十分なこともしばしばあります。
N+1問題の理解や対策方法、RDBのインデックスチューニングによるSQLの最適化、Web APIの実践的なページネーションの実装方法、CSRFやSQLインジェクションのような攻撃を防ぐためのセキュリティに関する知識など、高度かつ重要なトピックをDjangoのコントリビュート経験もある筆者が分かりやすく解説します。【本書のゴール】
Djangoを使ったWebアプリケーション開発のベストプラクティスを把握し、業務に活かせる実践的な知識を身につけることを目指します。
- 芝田 将 著
- 2021年07月19日 発行
- 312ページ
- 定価3,850円(税込)
スポンサーリンク
スポンサーリンク
内容のまとめと感想
PythonのWebアプリケーションフレームワークである、Djangoの解説書になります。
入門書という立ち位置になっていますが、タイトルに実践と付いているだけあって、レベルは高め。
Python未経験、Webアプリケーション未経験者がいきなり本書を読むとおそらくキツイと思います。
また、上記を満たしていてもDjangoをこれから学ぼうと思っている人よりかは、入門書等で一通りの基本は学んだ人の方が本書には向いていると思います。
というのも、入門的な内容はサクッと説明されていて、代わりに個々の機能の細かい部分に関して説明を多く割いているからです。(例えば、Django ORMのベーシックな機能はサクッと説明して、代わりにn+1問題やインデックス、クエリの解析と高パフォーマンス化などに説明を割いています。)
ですので、Djangoを学びたいエンジニアが入門書の次の2冊目に読むのに最適なのではないかと思います。
個人的には、下記の「Djangoのツボとコツがゼッタイにわかる本」を最初に読んで、Webサイトを実際に構築しながら、一通りの作り方を学んだ後に本書を読んだ状態です。入門書としてはかなり敷居が低いのでおすすめです。
良かった点
前述の通り、基本的な機能に関して、より深い部分に説明をしっかりと割いている点です。
とりえあず動くではなく、実践レベルで動かすために必要な情報が書かれているので参考になります。
実際にコードスニペットを登録するウェブサイトをテーマとして、実装を行いながら説明していくのですが、前半はテスト駆動開発的なテストコードを先に書きながらコードを実装していくという点も面白いですね。
気になった点
入門的な内容がサクッと説明されているのは前述の通りですが、コード含めて説明がかなりシンプルで、細かいところを説明しない点が多いと感じました。
見たことのないメソッドや関数がサラッと使われていたりするので、自分でしっかりとコードを読んだり、別途ググったりしないとわからないといけない点がありました。
また、DjangoのViewに関しては、関数ベースやクラスベースの記述が混在しているので、できれば最初の方で両方説明した上で、途中からどちらかに統一しておいた方が良かったのではないかと思いました。
(関数ベースの方が入門的にはわかりやすいが、個人的にはクラスベースが好き)
スポンサーリンク
読書ノート(個人的なまとめ)
第1部 コードスニペット共有サイトの開発
コードスニペットを登録、表示できるようなWebサイトを実際に作りながら、Djangoの基本的な機能を学んでいく章になっています。
DBを使ったマイグレーションやORM、ビューテンプレートなど入門書がじっくりと順々に説明する部分を全てサラッと説明するので、Django初体験だと追いつくのが大変かも。
最初からユニットテストを作りながらの、テスト駆動的な開発方法になるのも面白いですが、初心者にはキツイかもしれませんね。
get_object_or_404
モデルからデータを取得する時に一致条件でデータがない場合に自動で404を投げてくれる。
デーの取得結果に応じて処理を分けて実装しなくて良いので楽。
1 2 3 |
## Snippetモデルに対してpkが1でnamaeがaaaaのものが無いかをDBに問い合わせる ## 存在しなければ404ページを表示してくれる snippet = get_list_or_404(Snippet, pk=1, name='aaaa') |
第2部 モデル定義とクエリ操作
Django ORMを使用したモデルやクエリ操作に関して深堀していく章です。
N+1問題やインデックス、クエリのチューニング等、入門書では触れないもしくは最後の方で軽く説明される内容がしっかりと説明されています。
モデルマネージャとQuerySet
プロジェクト内で頻繁に使用されるクエリ操作はモデルマネージャやQuerySetにまとめるのが良い。
モデルマネージャの例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class DraftSnippetManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(is_draft=True) class Snippet(models.Model): ... is_draft = models.BoolenaFiled(_('Draft'), default=True) objects = models.models.Manager() ## 定義したマネージャを使用 drafts = DraftSnippetManager() ### 使用例 Snippet.drafts.all() |
クエリセットの例。objectsにクエリセットのas_managerメソッドを読んでマネージャとしてセットする。
クエリセットの方はメソッドの同時呼び出しなども可能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class SnippetQuerySet(models.QuerySet): def drafts(self): return self.filter(is_draft=True) def recent_updates(self): return self.order_by("-updated_ad") class Snippet(models.Model): ... is_draft = models.BoolenaFiled(_('Draft'), default=True) ## 定義したクエリセットのマネージャを指定 objects = SnippetQuerySet.as_manager() ### 使用例 メソッドのチェーンが可能 Snippet.objects.drafts().recent_updates() |
本書だけだとさっくりと説明されているだけなので、下記が細かく説明されていて参考になった。
https://selfs-ryo.com/detail/model_methods
明示的なトランザクションの管理
transaction.atomicでトランザクションのスコープを指定して、モデルの操作を行う事でトランザクションをかけられる。
データの更新であれば、select_for_updateで行ロックをかけてデータを取得して更新をかける
1 2 3 4 5 6 7 |
def hoge_view(request): ... with transaction.atomic(): ## select_for_updateで対象の行に対してロックをかける products = Product.objects.select_for_update().get(id=1) product.inventory -= 1 product.save() |
テーブル結合
- 1:1の関係の場合(ForeignKeyやOneToOneField)
- select_relatedを使用する
- 上記以外の多数の関係(n:nなど)
- prefetch_relatedを使用する
第3部 ビュー
ビューの説明を行っている章です。
Djangoの場合、MVCでいうところ C(コントローラ)がビューと呼ばれるのでややこしいのですが、HTTPリクエストやルーティングといったコントローラ的な役割の機能の説明がされています。
ここでやっとクラスベースのビューに関して説明がされます。
その他にもデコレーターやミックスイン、ミドルウェアを使用した再利用性の向上に関しても触れられていますが、かなりサラッと触れているだけなのでここをもう少し深掘りして説明して欲しかったです。
第4部 テンプレートエンジン
MVCでいうところのV(ビュー)にあたる、画面周りの説明です。
DjangoでもHTMLベースのテンプレートエンジンは、一般的なWebアプリと似ているので経験者であればサクッと読めます。
テンプレートの継承、埋め込み、テンプレートフィルタ等々、基本的な機能をわかりやすく解説してくれています。
第5部 フォーム
フォーム画面などにおいて、必要となるフォームに関して説明する章です。
基本的にModelFormsを中心とした説明で、カスタムバリデーションなど基本的な説明が中心です。
前章ではXSSの説明がありましたが、こちらではCSRFの説明があったりとセキュアな実装に関してもケアしてくれています。
第6部 テスト
Djangoでは最初からユニットテストが組み込まれていますが、それらを使ったユニットテストに関して説明がされています。
個人的にはCD/CI、BDD、Seleniumなど幅広く取り上げすぎて全体的に薄い内容になっている感じがしました。
1章でせっかくTDDでユニットテスト使っていたのだから、個々の層に対してこういったテストを書くといった内容をここでまとめてくれた方が良かったと個人的には思いました。
モックやスタブの話も出てきますが、紹介レベルといった感じなのと、DBに関しては実際にアクセスしてテストする方法がメイン(統合テスト)で、もう少しこの章は不要なものは削ぎ落として個々の内容を充実させて欲しかったです。
第7部 認証 認可
1章でさくっとログインとログアウトなどの認証機能を実装していましたが、本章ではそれ以外の機能も含めて認証と認可に関してまとめている章です。
入門書だとこのあたりはall_authあたりを使ってよくわからず実装してしまいがちですが、本書では標準パッケージだけで一通りの機能を実装するので、仕組みを学ぶには良かったです。
第8部 Web API開発
Django REST Frameworkを使用したWeb APIの実装に関して説明している章です。
基本的にDjango本体に似た構造ではありますが、使用するクラスなどが微妙に違うのと、使った事が無かったので参考になりました。
ページネーションやJWTといった入門書ではあまりやらないようなスコープまで含んでいるのも面白いです。
本書にも書いてありますが、WebAPI自体の設計はオライリーのヘビ本(Web API The Good Parts)が非常に参考になるので合わせて読んだ方が良いですね。
第9部 ケース別レシピ集
これまでの章には入っていないが、知っておくと良い機能をまとめている章です。
国際化(多言語化)、メッセージフレームワーク、メール送信、キャッシュなどよく使われるケースが説明されています。