akiyoko です。
昨年10月の 技術書典5 で Django の技術同人誌シリーズの2作目となる新刊 『現場で使える Django の教科書《実践編》』 を出してから数ヶ月経ちました。その間、Django 本の読書会 をしたり、Amazon で電子版の販売を開始したり、年末のコミケに初参加してサークル「あきよこブログ」として本を再販したりするなど、いろいろとイベントが目白押しでした。
そうやって技術書典5 からの数ヶ月を忙しく過ごしたわけですが、ふと思い返すと私のブログで《実践編》の内容を紹介していなかったことに最近気づいたので、この記事で 『現場で使える Django の教科書《実践編》』の概要と読みどころ について紹介しておきたいと思います。
現在、《実践編》の紙の本はオンラインショップの BOOTH で、電子版は Amazon で販売中です。
◆ BOOTH(紙の本)
◆ Amazon(電子版)
《実践編》の概要
本書は Python 製の Web アプリケーションフレームワーク「Django(ジャンゴ)」の解説書の第二弾で、Django を本格的に使っている/使おうとしている開発者に向けた本です。開発の現場で必要になる知識、よくある問題へのヒントや解決策を中心に、デプロイやセキュリティ、高速化などさらに実践的な内容 にも踏み込んでいます。前作同様、開発現場に必携の一冊にすべく、様々なノウハウをこれでもかと詰め込みました。
《実践編》をひと言で表すと、「基礎のちょっと先に手を伸ばしてみようと考えている開発者に向けたステップアップ本」になっています。前作同様、Django プロジェクトの現場にあると嬉しい一冊になっているはずです。
対象読者
《実践編》の対象読者は、
- Django のことをもっと知りたい方
- 仕事の現場で本格的にDjangoを使いたい方
を想定しています。
Django 公式チュートリアル や Django Girls Tutorial では物足りなかった方や、実践的な開発に不安のある方にも十分満足できる一冊になっているはずです。そしてもちろん、前作の《基礎編》を読み終えた方にはちょうど良いレベルのステップアップ本 になっているでしょう。
なお、Django の基礎(全体像、コンポーネントごとの仕組みや基本的な実装方法など)については説明していません。それらについては、前作《基礎編》でベストプラクティスを交えて詳しく解説しています。
各章の読みどころを紹介
目次
第1章:はじめに
第2章:開発のヒント(認証まわりをサクッと実装)
第3章:開発のヒント(Bootstrap 4 対応)
第4章:開発のヒント(Ajax 対応と JSON レスポンス)
第5章:開発のヒント(ファイルアップロード)
第6章:ユニットテスト
第7章:デプロイ
第8章:セキュリティの TIPS
第9章:高速化のための TIPS
付録A:メール送信の設定
付録B:Let's Encrypt で SSL/TLS 証明書発行
第2章:開発のヒント(認証まわりをサクッと実装)
Django を使った Webアプリ実装の第一歩として、まず「ユーザー認証まわり」から実装することが多かったりする のではないでしょうか。実は、Django 組み込みの認証システムを使うと、認証まわりの機能をサクッと実装することができます。そのことを知らずに、ログインやパスワード変更といった機能を自前で実装してしまったりするのは「DRY(Don’t repeat yourself)」の原則に反します。しかしながら、認証まわりのノウハウについてまるっと解説した本は(少なくとも日本語の書籍では)ありませんでした。
本章ではまず、最小限の実装でユーザー認証まわりの機能をひと揃えするための具体的な方法について解説 をしています。
しかし実際の現場では、サクッと実装しただけでは問題がある場合があります。それは「仕様変更」です。Django デフォルトの認証の仕組みをそのまま利用できる場合はよいのですが、ちょっとカスタマイズしたいとなった場合に難易度が途端に跳ね上がるという点には注意が必要でしょう。たとえば、「ユーザー名ではなくメールアドレスとパスワードで認証できるようにしたい」といったニーズは日常茶飯事に発生します。このような場合にどのように改修すればよいのか、その改修ポイントや具体的なコードを載せています。
本章の最後ではさらに実践的なニーズのひとつである「ソーシャル連携認証」について解説をしています。これを読めば、「OAuth って何?」というレベルの方でも、ソーシャル連携認証の仕組みが分かるようになり、GitHub アカウントでソーシャル認証ログインできる Django サイトが実装できるようになります。
第3章:開発のヒント(Bootstrap 4 対応)
ところで皆さんは「味覇(ウェイパー)」という調味料をご存知ですか?
味覇は中華料理のベースの味付けに「とりあえず使っとけ」という感じで万能・安心・簡単に使える調味料なのですが、「Bootstrap は Webサイトのスタイルを下支えする味覇である」というブログ記事を見て思わず吹き出してしまったことがありました。
さて、業務で Webアプリを作る際、特にプロトタイプを作る段階では Bootstrap などの CSSフレームワークをとりあえず入れてスタイルを「それ」っぽく整えておくのは常套手段ではないでしょうか。CSSフレームワークはデザインセンスの乏しいエンジニアの強い味方です。
第3章の前半では、Webアプリ開発の初めの一歩として押さえておくべき「Bootstrap 4 の導入方法」について書いています。Django に特化した話はほとんどありません。後半では、「django-bootstrap4」という Django パッケージを使って「Bootstrap 4」の適用をサポートする方法について解説しています。
第4章:開発のヒント(Ajax 対応と JSON レスポンス)
Django のビューでは通常のレスポンス以外に、JSONレスポンスを返すことができます。テンプレートの JavaScript から Ajax リクエストを送信して JSONレスポンスを受け取ることで画⾯全体を更新せずに⼀部の部品だけを書き換えることができるため、これを利用することで UI・UX のよい Web画面を制作することができます。
なお、Django から JSON を返す⼿段としては、「Django REST framework」と呼ばれる有名なパッケージを使う⽅法があります。REST でリクエストをしてJSON で受け取るような SPA やアプリのバックエンドとしてよく利⽤されています。しかしこの章で紹介する⽅法によって、Django REST framework を使わなくても簡単に JSON レスポンスが返せることがお分かりいただけると思います。
なお、JavaScript で Django に Ajaxリクエストを送信する際、またビューから JSONレスポンスを返す際にそれぞれちょっとした注意点があります。第4章の中盤ではそれらの注意点について具体的なコード例を交えて解説をしています。
章の終盤では、AjaxとJSONレスポンスを応用すればこんなアプリが作れるぞ!というちょっとしたアプリのコードを紹介しています。時系列データを保持した pandas の DataFrame を JSONレスポンスとして返し、テンプレート側では「Tabulator」という JavaScript のライブラリを利⽤して JSON を処理するというサンプルになっています。はっきり言って、ポエムです。
第5章:開発のヒント(ファイルアップロード)
Django では、静的ファイルのうち、システム管理者を含めたユーザーが Webアプリケーションを利⽤してアップロードする CSV や PDF、画像などのファイルを「メディアファイル」と呼んでいます。
前作《基礎編》では「STATIC_ROOT」「STATICFILES_DIRS」「STATIC_URL」などの静的ファイル関連の設定について詳しく説明しましたが、本作では、メディアファイル(およびファイルアップロード)について、設定から実装、注意点に至るまで詳しく解説しています。
少し発展的な内容として、「django-storages」を使ってクラウドストレージにファイルアップロードする方法とその設定について記載しています。そのほか、ファイルアップロードを利用する際に便利に使える Django パッケージをいくつか紹介しています。
章の最後は、不正なファイルがアップロードされないためのセキュリティ対策について。ユーザーがアップロードしたファイルを他のユーザーに配信する場合は、ファイルの不正チェックが必須になるでしょう。
Django の最もハマりがちなポイントといえば「静的ファイル」でしょう。メディアファイルは静的ファイルと混同しやすく、ファイルアップロードの実装は簡単ですが仕様に少し癖があります。業務用 Webアプリではよく利用されるので一度全体を整理して把握しておきたいところです。
第6章:ユニットテスト
動くコードも大事ですが、現場においてはテストも同じくらい重要です。 Django では、以下に示すようなユニットテストのサポートが最初から用意されており、非常に充実しています。
- test コマンド
- テストランナー
- 標準の unittest.case.TestCase を継承した Django の TestCase クラス
- Webテストクライアント
Django のユニットテストで押さえておくべき知識は、次の3点です。
- ① 慣例と命名ルール
- ② TestCase における各種メソッドの実行フロー
- ③ テストの実行方法
まず、慣例と命名ルールを押さえておかないと、テストランナーが自動で収集してくれなくなります。次に、Python 標準の unittest.case.TestCase を継承した TestCase には、テスト用のデータベース作成および削除、フィクスチャと呼ばれるファイルからのテストデータ生成、登録および変更したテストデータのロールバックなどの機能が追加されています。それらを含めた各種メソッドの実行フローや拡張ポイントを把握しないと、効率の良いテストケースを書くことはできません。Django 標準のユニットテストは test コマンドから実行できますが、その実行方法についても押さえておく必要があるでしょう。
また、多くのプロジェクトでは Coverage.py を導入してカバレッジを計測します。カバレッジ・レポートを品質指標として利用できるほか、実際に実行されたコード行を可視化することでテストケースに抜け漏れがないか、あるいはテスト条件や実装方法に誤りがなかったかどうかを把握できるといったメリットもあります。
第7章:デプロイ
「デプロイ」とは、実際に利用する環境に Webアプリを配備(deployment)して、ユーザーから利用できる状態にすることを指します。特に、本番環境へのデプロイは「本番デプロイ」などと呼ばれます。
デプロイの工程には、サーバの調達から必要なソフトウェアのインストールやその設定、データベースの構築や初期データの投⼊、セキュリティの設定など、ありとあらゆる作業が含まれます。本章では、インフラエンジニアでない⽅にもできるだけ分かりやすいように、デプロイ⼿順を最初から最後まで一気通貫に説明していきます。具体的には、サーバに乗り込むための鍵ペアの作成から Let's encrypt による常時 SSL化の設定まで、かなーり詳しく書いています。全部で44ページ! 世界で一番詳しい Django のデプロイ解説書を目指しました。
本章で構築するサーバ構成は、サーバ1台でリバースプロキシサーバ、アプリケーションサーバ、データベース、ファイルサーバなど全てをまかなうオールインワン構成です。シンプルで安上がりになる反⾯、可⽤性(冗⻑化)やスケールを考慮していない点には注意が必要です。
- サービス: DigitalOcean(クラウド)
- OS: Ubuntu 18.04
- サービスマネージャ: systemd
- データベース: MySQL 8.0 (またはPostgreSQL 10.5)
- リバースプロキシサーバ: Nginx 1.14
- WSGI サーバ: Gunicorn 19.9
- Python: 3.6.5
- Django: 2.1
なお、各ソフトウェアのバージョンはできる限り最新のものを利用しています。
第8章:セキュリティの TIPS
前章では本番デプロイについて書きましたが、本番公開時にどうしても気になるのがセキュリティの問題 ですよね。いざ本番リリースしようとしたときに「これって公開しちゃって大丈夫なの?」と怖くなってしまうことはないでしょうか?
Djangoはフルスタック(全部入り)が大きな特徴のひとつですが、セキュリティ対策もその中にちゃんと含まれています。 ただし、「適切に利用していれば」という条件付きです。というわけで、本章の前半は Django が提供しているセキュリティ対策についてのおさらいです。後半では、本番デプロイを想定したオリジナルの「セキュリティ・チェックリスト」を用意しました。ぜひ本番リリース時にお役立てください。
第9章:高速化のための TIPS
「Django は遅い」なんてもう言わせない!
最終章の9章では、簡単に実現できる高速化の具体策について解説しています。前章で説明したようにセキュリティまで「全部入り」の Django は悪く言えば重厚長大で、パフォーマンスは二の次であると言わざるを得ません。
ここで高速化の対策として解説しているのは二点です。一点目は、データベースのクエリ実行について。特定の画面のレスポンスが異常に遅い場合、クエリ実行に問題がある(クエリの本数が想定以上に多くなってしまう、いわゆる「N+1」問題が発生している)場合がありますが、その対策について解説します。二点目は、Django にデフォルトで含まれている「キャッシュ」機能について、その使いどころをいくつか具体的に挙げています。アプリ次第では劇的に応答時間が短くなることもあるでしょう。
《実践編》の評価
SNS やブログ上での『現場で使える Django の教科書《実践編》』の評価を勝手に掲載させていただきます。
技術書典で買ったakiyokoさんのDjango実践編、今まさに知りたかった情報で目から鱗
— いろどり (@_centriv) October 8, 2018
現場で使えるDjangoの教科書実践編読みました。認証周りやパフォーマンス出ない話がつらぽよなので、そこらへんをカバーしてて嬉しい。ソシャゲAPIサーバを作る用ではなさそうな雰囲気がありました
— izm (@izm) October 16, 2018
まだ軽く全体に目を通した程度ですが基礎編に続き「もっと早くほしかった!」と思えるすばらしい内容です。デプロイの部分が手厚いのもよいですね。間違いなく今後あたらしいDjango製のアプリが世に公開される手助けになると思います😊じっくり読ませていただきます!
— Qtaro🍠👻🐣 (@Daisuke_9taro) October 18, 2018
BOOTHから購入させていただきましたが、Django開発者は手元にあると嬉しい1冊だとおもいます
— サキ / curumi, Inc. (@sakimyto) October 21, 2018
丁寧に書かれていて、似たような他のモジュールを使う場合でも参考になる1冊でした◎#studeploy https://t.co/9SLm4ThLBu
会社で布教したらよいものだということで《基礎編》+《実践編》紙の本2冊セットを今日会社で買いました。アイスの本はよい本だけど英語の壁が高かった・・・ https://t.co/HKqeSFevQ0
— okazaki jun (@dario_okazaki) December 4, 2018
Django開発日記エピソード2~Bibleとの遭遇~
— kenji oda (@kenji_oda0618) December 30, 2018
特に、実践編の内容が激アツな件https://t.co/Btll7MGUoZ#スターウォーズ風開発日記
https://ks6088ts.github.io/post/20190104_djangobook/ks6088ts.github.io
まとめ
おかげさまで、前作の Django の技術同人誌『現場で使える Django の教科書《基礎編》』は まだまだ販売好調で、販売累計数は 2,500冊を超えています。 こちらも Django プロジェクトの現場にあると嬉しい一冊ではありますが、どちらかというと、現場に入った新規参画者や新人に読んでほしい初心者・初級者向けの一冊になっていると思います。
◆『現場で使える Django の教科書《基礎編》』Amazon(電子版/ペーパーバック版)
- 作者:横瀬 明仁
- 発売日: 2018/08/26
- メディア: オンデマンド (ペーパーバック)
基礎編を読み終えて、仕事でもっと本格的に使っていこうと考えているなら、今回紹介した『現場で使える Django の教科書《実践編》』が絶対オススメです。 何かで詰まって半日無駄にするくらいなら、《実践編》を一冊買う方が絶対安いです。きっと役に立つ情報がたくさん載っていると思います。特に、デプロイや高速化、セキュリティ、認証、ユニットテストに関しては、これほどまとまった情報を提供しているところは他にはまだないと自負しています。
気になった方はこの機会に《実践編》をぜひどうぞ。
なお、紙の本で『現場で使える Django の教科書』シリーズの二冊(基礎編・実践編)をお得に手に入れたいという方には、BOOTH での二冊セット販売も用意しています。