現場で役立つ実践的なノウハウを徹底解説
【Djangoとは】
Djangoは、Pythonで人気のあるフルスタックWebフレームワークです。
強力なテンプレートエンジンやO/Rマッパーに加え、ユーザー認証や国際化、管理画面など、Webアプリケーション開発で必要になるありとあらゆる機能を高い柔軟性で提供し、高速なWebアプリケーション開発を可能にします。
【本書のポイント】
本書は、業務で必ず役に立つ実践的なDjangoの解説書です。モデルやビュー、テンプレートといった基本コンポーネントの解説はもちろん、Djangoの実践的なテストテクニック、ユーザーモデルのカスタマイズ方法、認証処理のベストプラクティスなど、Web開発において必ず知っておくべき内容を幅広く取り上げました。
また実際に業務でWebアプリケーション開発に取り組む際には、これらの理解だけでは不十分なこともしばしばあります。
N+1問題の理解や対策方法、RDBのインデックスチューニングによるSQLの最適化、Web APIの実践的なページネーションの実装方法、CSRFやSQLインジェクションのような攻撃を防ぐためのセキュリティに関する知識など、高度かつ重要なトピックをDjangoのコントリビュート経験もある筆者が分かりやすく解説します。
【本書のゴール】
Djangoを使ったWebアプリケーション開発のベストプラクティスを把握し、業務に活かせる実践的な知識を身につけることを目指します。
【Djangoのバージョン】
Django 3.2 LTS対応(2024年4月までサポートされるバージョン)
【著者プロフィール】
芝田 将(しばた・まさし)
2017年株式会社サイバーエージェントに新卒入社後、ABEMA配信チームにて動画ストリーミングサーバーやトランスコーダーの開発を担当。
2019年より研究組織AI Labに異動し、機械学習モデルのハイパーパラメーター最適化ソフトウェアの研究開発に従事。
また2020年よりPython領域のDeveloper Expertsに選出される。OSS開発では、go-promptやkube-promptの開発者として知られる。
自動ハイパーパラメータ最適化フレームワークOptunaコミッター。Kubeflow/Katibレビュアー。Django, Gunicornコントリビューター。
共訳書『エキスパートPythonプログラミング改訂2版』(KADOKAWA、2018/2)。PyCon JP、Django Congress JPでの登壇経験多数。
NeurIPS 2020 Black-Box Optimization Challenge 世界5位入賞。
第1章 コードスニペット共有サイトの開発
1.1 Djangoプロジェクトのはじめかた
1.2 Djangoアプリケーションの作成とHello World
1.3 データベースとの連携
1.4 テンプレートエンジンによるHTMLの生成
1.5 テンプレートの部品化とCSSの適用
1.6 ユーザー認証をサクッと作る
1.7 宿題:コメント機能の実装
第2章 モデル定義とクエリ操作
2.1 Django ORMによるモデル定義
2.2 Django ORMによるクエリ操作
2.3 N+1問題の概要とその対策
2.4 インデックスによる効率的なデータの取り出し
2.5 マイグレーション
2.6 SQLインジェクションによる攻撃を理解する
第3章 ビュー
3.1 ビューの基本
3.2 再利用性の高いビューの開発
3.3 URLディスパッチャー
3.4 HttpRequestとHttpResponseを使いこなす
第4章 テンプレートエンジン
4.1 Djangoテンプレート言語の基本
4.2 テンプレートエンジンの設定
4.3 テンプレートタグとテンプレートフィルターを使いこなす
4.4 テンプレートのセキュリティ対策
第5章 フォーム
5.1 フォームの基本と全体像
5.2 バリデーション処理のカスタマイズ
5.3 HTMLフォーム生成時のカスタマイズ
5.4 ModelFormをいつ使うべきか、あるいはいつ使うべきではないか
5.5 クロスサイトリクエストフォージェリ(CSRF)による攻撃を理解する
第6章 テスト
6.1 テストの観点と考え方
6.2 実践的なテストテクニック
6.3 テストに関連するツールチェイン
6.4 まとめ:さらにテストを使いこなすために
第7章 認証・認可
7.1 認証処理の基本とカスタマイズ
7.2 ユーザーモデルのカスタマイズ
7.3 権限管理(認可)
7.4 パターン別認証処理実装ガイド
第8章 Web API開発
8.1 Django REST FrameworkによるJSON APIの実装
8.2 Web APIの設計プラクティス
第9章 ケース別レシピ集
9.1 静的ファイルの配信
9.2 メッセージフレームワーク
9.3 国際化(多言語対応)
9.4 Eメールの送信
9.5 GunicornやuWSGIを使用する
9.6 デーモン管理ツールの導入
9.7 NginxをHTTP Proxyとして導入する
9.8 キャッシュフレームワーク
9.9 設定ファイルの分割
9.10 Django管理サイトのカスタマイズ
9.11 管理コマンドの作成
Appendix 関連リソース
A.1 参考資料(書籍)
A.2 参考資料(Webサイト)
A.3 本書で紹介したサードパーティーライブラリ一覧
お問い合わせ
内容についてのお問い合わせは、正誤表、追加情報をご確認後に、お送りいただくようお願いいたします。
正誤表、追加情報に掲載されていない書籍内容へのお問い合わせや
その他書籍に関するお問い合わせは、書籍のお問い合わせフォームからお送りください。
利用許諾に関するお問い合わせ
本書の書影(表紙画像)をご利用になりたい場合は書影許諾申請フォームから申請をお願いいたします。
書影(表紙画像)以外のご利用については、こちらからお問い合わせください。
ご購入いただいた書籍の種類を選択してください。
刷数は奥付(書籍の最終ページ)に記載されています。
現在表示されている正誤表の対象書籍
書籍の種類:
書籍の刷数:
本書に誤りまたは不十分な記述がありました。下記のとおり訂正し、お詫び申し上げます。
対象の書籍は正誤表がありません。
最終更新日:2023年08月28日
発生刷 |
ページ数 |
書籍改訂刷 |
電子書籍訂正 |
内容 |
登録日 |
1刷 |
vi
上から11行目 |
2刷 |
済 |
誤 |
クロスタイリクエストフォージェリ |
正 |
クロスサイトリクエストフォージェリ |
備
考 |
※リフローEPUBの場合、「本書の対象読者と必要な事前知識、および構成」の「本書の構成」の5番目の段落が該当箇所です。 |
|
2021.07.20 |
1刷 |
ix
「サポートページ」のURL |
3刷 |
済 |
誤 |
https://www.shoeisha.co.jp/book/detail/9784798153964 |
正 |
https://www.shoeisha.co.jp/book/detail/9784798153957 |
|
2023.08.28 |
1刷 |
vii
表1,2 |
2刷 |
済 |
誤 |
・ライブラリなど
django-bootstrap4
・バージョン
3.0.0 |
正 |
・ライブラリなど
django-bootstrap5
・バージョン
1.0.0 |
備
考 |
※リフローEPUBの場合、「本書のサンプルの動作環境と付属データ・会員特典データについて」の「本書のサンプルの動作環境」にある表1と表2が該当箇所です。 |
|
2021.07.21 |
1刷 |
004
図1.3 |
2刷 |
済 |
誤 |
・URLの部分
http://localhost:8000/sunippets/new
・コードの部分
class Snippet(moidels.Model): |
正 |
・URLの部分
http://localhost:8000/snippets/new/
・コードの部分
class Snippet(models.Model): |
|
2021.07.20 |
1刷 |
004
図1.4 |
2刷 |
済 |
誤 |
・URLの部分
http://localhost:8000/sunippets/1/
・コードの部分
Class Snippet(models.Model):
code = models.TextField("コード".blank=True)
class Meta():
db_table = "sunippets"
|
正 |
・URLの部分
http://localhost:8000/snippets/1/
・コードの部分
class Snippet(models.Model):
code = models.TextField("コード", blank=True)
class Meta:
db_table = "snippets"
|
|
2021.07.20 |
1刷 |
012
図1.9 |
2刷 |
済 |
誤 |
methid: GET |
正 |
method: GET |
|
2021.07.21 |
1刷 |
025
図1.15 |
3刷 |
済 |
誤 |
|
正 |
|
|
2021.09.22 |
1刷 |
030
図1.18 左上「tatus 200」の箇所 |
3刷 |
済 |
誤 |
|
正 |
|
備
考 |
「tatus 200」を「status 200」に修正しました。 |
|
2023.07.24 |
1刷 |
035
リスト1.20、リスト1.21のキャプション |
2刷 |
済 |
誤 |
リスト1.20 テンプレートエンジンの分岐処理
リスト1.21 テンプレートエンジンのforループ |
正 |
リスト1.20 テンプレートエンジンのforループ
リスト1.21 テンプレートエンジンの分岐処理 |
|
2021.07.28 |
1刷 |
058
リスト1.43のキャプション |
2刷 |
済 |
誤 |
snippets/static/snippets/style.css |
正 |
snippets/static/snippets/css/style.css |
|
2021.08.04 |
1刷 |
063
下から3行目 |
3刷 |
済 |
誤 |
https://127.0.0.1:8000/login にアクセスして動作を確認してみましょう。
|
正 |
http://127.0.0.1:8000/accounts/login にアクセスして動作を確認してみましょう。 |
備
考 |
※リフローEPUBの場合、リスト1.49の下、3つ目の段落が該当箇所になります。 |
|
2023.07.15 |
1刷 |
066
リスト1.51 |
2刷 |
済 |
誤 |
{% load bootstrap5 %} |
正 |
{% load django_bootstrap5 %} |
|
2021.08.04 |
1刷 |
075
モデルフィールドの一覧の部分 |
2刷 |
済 |
誤 |
PostgreSQL:ArrayField、HStoreField、JSONField、IntegerRangeField、DateRange Field、... |
正 |
PostgreSQL:ArrayField、HStoreField、IntegerRangeField、DateRange Field、... |
備
考 |
※リフローEPUBの場合、「2.1.3 モデルフィールドの定義」の「モデルフィールドの一覧」の箇条書きが該当箇所になります。 |
|
2021.07.28 |
1刷 |
079
リスト(上から4~5行目) |
2刷 |
済 |
誤 |
def __str__(self):
return f'{self.pk} {self.title}'
|
正 |
def __str__(self):
return f'{self.pk} {self.text}'
|
備
考 |
※リフローEPUBの場合、2章の図2.1の次に掲載されているリストが該当箇所になります。 |
|
2021.08.04 |
1刷 |
086
下部コード内(下から5行目) |
2刷 |
済 |
誤 |
class SnippetQuerySet(models.Manager):
|
正 |
class SnippetQuerySet(models.QuerySet): |
備
考 |
※リフローEPUBの場合、「2.2.4 モデルマネージャーやQuerySetのカスタマイズ」の3つ目のリストが該当箇所になります。 |
|
2021.08.20 |
1刷 |
092
メモ |
2刷 |
済 |
誤 |
またMySQLではjoin_buffer_sizeパラメーターより・・・ |
正 |
またMySQLではjoin_buffer_sizeパラメーターにより・・・ |
備
考 |
※リフローEPUBの場合、「2.3.2 prefetch_relatedによる回避策」の直前にあるメモが該当箇所になります。 |
|
2021.07.28 |
1刷 |
108
2つの目のコード
|
3刷 |
済 |
誤 |
class Snippet(models.Model):
...
created_at = models.DateTimeField('登録日時', auto_now_add=True) # Aさんが追加
class Snippet(models.Model):
...
created_at = models.DateTimeField('登録日時', auto_now_add=True) # Bさんが追加
(画像クリックで拡大) |
正 |
class Snippet(models.Model):
...
created_at = models.DateTimeField('登録日時', auto_now_add=True) # Aさんが追加
class Snippet(models.Model):
...
updated_at = models.DateTimeField('更新日時', auto_now=True) # Bさんが追加
(画像クリックで拡大) |
備
考 |
誤の方はソースコードが1つにくっついてしまっていますが、正のようにソースコードを2つに分けてください。
※リフローEPUBの場合、図2.8の直前のリストが該当箇所になります。 |
|
2021.10.01 |
1刷 |
114
図3.1 |
2刷 |
済 |
誤 |
HttoRequest |
正 |
HttpRequest |
|
2021.07.21 |
1刷 |
117
(コード除く)本文上から7行目 |
2刷 |
済 |
誤 |
例:b'{"message": "Hello World"')
|
正 |
例:b'{"message": "Hello World"}') |
備
考 |
※リフローEPUBの場合、「3.1.3 HttpRequestオブジェクト」の箇条書きが該当箇所になります。 |
|
2021.08.20 |
1刷 |
119
メモのコード |
2刷 |
済 |
誤 |
from django.shortcuts import render, get_object_or_404
def snippet_detail(request, snippet_id):
snippet = Snippet.objects.get(pk=snippet_id)
return render(request, 'snippets/snippet_detail.html',
{'snippet': snippet})
|
正 |
from django.shortcuts import render, get_object_or_404
def snippet_detail(request, snippet_id):
snippet = get_object_or_404(Snippet, pk=snippet_id)
return render(request, 'snippets/snippet_detail.html',
{'snippet': snippet})
|
備
考 |
※リフローEPUBの場合、「3.1.5 例外を使ったエラー処理」のメモが該当箇所になります。 |
|
2021.07.28 |
1刷 |
121
(リスト除く)下から3行目 |
2刷 |
済 |
誤 |
as_viewメソッド使用します。 |
正 |
as_viewメソッドを使用します。 |
備
考 |
※リフローEPUBの場合、「3.2.2 クラスベースビューやMixinを利用する」の1つ目のリストの次の段落が該当箇所になります。 |
|
2021.07.28 |
1刷 |
130
表3.1のハンドラー名 |
2刷 |
済 |
誤 |
http400
http403
http404
http500 |
正 |
handler400
handler403
handler404
handler500 |
|
2021.07.28 |
1刷 |
134
図3.5 |
2刷 |
済 |
誤 |
Messgae body |
正 |
Message body |
|
2021.07.21 |
1刷 |
135
(図除く)本文上から4行目 |
2刷 |
済 |
誤 |
例:b'{"message": "Hello World"')
|
正 |
例:b'{"message": "Hello World"}') |
備
考 |
※リフローEPUBの場合、「3.4.2 x-www-form-urlencoded形式のデータの読み込み」の最初の箇条書きが該当箇所になります。 |
|
2021.08.20 |
1刷 |
171
上から5行目のコード |
2刷 |
済 |
誤 |
{% extends"base.html" %}
{% block main %}
<form method="post">
{% csrf_token %}
{{ form.as_p }}
</form>
{% endblock %}
|
正 |
<!-- titleフィールドのラベルのテキストを変更 -->
<p>
{{ form.title.errors }} <label for="{{ form.title.id_for_label }}">タイトル(必須)</label> {{ form.title }}
</p>
<p>
{{ form.code.errors }} {{ form.code.label_tag }} {{ form.code }}
</p>
<p><!-- descriptionフィールドも同様に表示 --></p>
|
備
考 |
※リフローEPUBの場合、図5.1の次に掲載されているリストが該当箇所になります。 |
|
2021.08.20 |
1刷 |
184
上のリストの最終行 |
3刷 |
済 |
誤 |
self.assertEqual(snippets[0].title, "title2") |
正 |
self.assertEqual(snippets[0].title, "title1") |
備
考 |
※リフローEPUBの場合、「6.1.2 モデルのテスト」の2つめのコードの最終行が該当箇所になります。 |
|
2023.07.15 |
1刷 |
222
図7.3 |
2刷 |
済 |
誤 |
PermissionsMixim |
正 |
PermissionsMixin |
|
2021.08.20 |
1刷 |
240
上から4-6行目 |
3刷 |
済 |
誤 |
>>> req = request.post('/api/snippets/', data={
... 'title': 'タイトル', 'description': '説明',
... 'code': 'print("Hello World")', 'created_by': 1})
|
正 |
>>> request.post('api/snippets/',
... content_type='application/json',
... data={'title':'タイトル','description':'説明',
... 'code':'print("Hello World"','created_by':1})
|
備
考 |
※リフローEPUBの場合、「8.1.1 SerializerによるJSONとの変換」の3つ目のグレー枠のコードが該当箇所になります。 |
|
2023.07.14 |
1刷 |
284,290
P.284:下から3行目、P.290:インデックス |
2刷 |
済 |
誤 |
drm-spectacular |
正 |
drf-spectacular |
備
考 |
リフローEPUBの場合、「A.3 本書で紹介したサードパーティーライブラリ一覧」の3つ目の項目が該当箇所になります。 |
|
2021.07.20 |
1刷 |
285, 290
P285:上から3つ目、P.290:インデックス |
2刷 |
済 |
誤 |
・P285
django-bootstrap4
GitHub https://github.com/zostera/django-bootstrap4
公式ドキュメント https://django-bootstrap4.readthedocs.io/
・P290
django-bootstrap4 |
正 |
・P285
django-bootstrap5
GitHub: https://github.com/zostera/django-bootstrap5
公式ドキュメント: https://django-bootstrap5.readthedocs.io/en/latest/
・P290
django-bootstrap5 |
備
考 |
リフローEPUBの場合、「A.3 本書で紹介したサードパーティーライブラリ一覧」の6つ目の項目が該当箇所になります。 |
|
2021.07.21 |