akiyoko blog

akiyoko の IT技術系ブログです

Windows + Python 3.8 で pip install mysqlclient が失敗する原因と対策

Windows + Python 3.8 の環境下で pip install mysqlclient が失敗する原因と対策について、備忘録をまとめておきます。

結論

Windows 10 + Python 3.8 + pip 19.2.2 以前という環境で、mysqlclient 1.4.6 の pip インストールが失敗する。その際、「Microsoft Visual C++ 14.0 is required」あるいは「include ファイルを開けません。'mysql.h':No such file or directory」といったエラーが出る。

対策としては、pip のバージョンを 19.2.3 以降にアップグレードするだけ。

なお、Microsoft Visual C++ をインストールする必要はありません。



詳細

エラー(その1)

PC に Visual C++ がインストールされていない状況では、「error: Microsoft Visual C++ 14.0 is required」というエラーが出ます。しかし、Visual C++ をインストールしても後述するエラー(その2)が出てしまい、根本解決には至りません。

《 発生条件 》
  • Windows 10
  • Python 3.8.2
  • pip 19.2.2
  • Microsoft Visual C++ 14.0 以降が未インストール
《 エラー内容 》
(venv) C:\Users\akiyoko\work\mysqlclient-test>pip install --no-cache-dir mysqlclient
Collecting mysqlclient
  Downloading https://files.pythonhosted.org/packages/d0/97/7326248ac8d5049968bf4ec708a5d3d4806e412a42e74160d7f266a3e03a/mysqlclient-1.4.6.tar.gz (85kB)
     |████████████████████████████████| 92kB 990kB/s
Installing collected packages: mysqlclient
  Running setup.py install for mysqlclient ... error
    ERROR: Command errored out with exit status 1:
     command: 'c:\users\akiyoko\work\mysqlclient-test\venv\scripts\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\akiyoko\\AppData\\Local\\Temp\\pip-install-yluhih0a\\mysqlclient\\setup.py'"'"'; __file__='"'"'C:\\Users\\akiyoko\\AppData\\Local\\Temp\\pip-install-yluhih0a\\mysqlclient\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\akiyoko\AppData\Local\Temp\pip-record-4l7b4jv9\install-record.txt' --single-version-externally-managed --compile --install-headers 'c:\users\akiyoko\work\mysqlclient-test\venv\include\site\python3.8\mysqlclient'
         cwd: C:\Users\akiyoko\AppData\Local\Temp\pip-install-yluhih0a\mysqlclient\
    Complete output (24 lines):
    running install
    running build
    running build_py
    creating build
    creating build\lib.win-amd64-3.8
    creating build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\__init__.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\_exceptions.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\compat.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\connections.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\converters.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\cursors.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\release.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\times.py -> build\lib.win-amd64-3.8\MySQLdb
    creating build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\__init__.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\CLIENT.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\CR.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\ER.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\FIELD_TYPE.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\FLAG.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    running build_ext
    building 'MySQLdb._mysql' extension
    error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
    ----------------------------------------
ERROR: Command errored out with exit status 1: 
    ...(略)...


ちなみに、Visual Studio Community 2019 のインストール時に、Visual C++ を合わせてインストールすることができます(根本解決にはならないので悪しからず)。手順を以下に示します(が、やるだけ無駄ですのでご注意を)。

Visual Studio 2019 のダウンロードページ から、コミュニティ版のインストーラをダウンロードします。

f:id:akiyoko:20200420222420p:plain:w400

ダウンロードしたインストーラをダブルクリックすると、Visual Studio Installer が起動します。「個別のコンポーネント」から「Visual C++」を検索して、「C++ x64/x86 ビルドツール」を選択してインストールします。

f:id:akiyoko:20200420223318p:plain:w500

「Visual C++」がインストールできました。Windows の「アプリと機能」から確認可能です。

f:id:akiyoko:20200420223337p:plain:w400


なお、「Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019」は、https://support.microsoft.com/en-gb/help/2977003/the-latest-supported-visual-c-downloads からも exe ファイルを直接ダウンロードしてインストールが可能です。PC の環境に合わせてご利用ください(私の環境は「x64」でした)。




エラー(その2)

PC にすでに Visual C++ がインストールされていても、pip のバージョンが 19.2.2 以前だと、「fatal error C1083: include ファイルを開けません。'mysql.h':No such file or directory」というエラーが出てしまいます。

《 発生条件 》
  • Windows 10
  • Python 3.8.2
  • pip 19.2.2
  • Microsoft Visual C++ 14.0 以降がインストール済み
《 エラー内容 》
(venv) C:\Users\akiyoko\work\mysqlclient-test>pip install --no-cache-dir mysqlclient
Collecting mysqlclient
  Downloading https://files.pythonhosted.org/packages/d0/97/7326248ac8d5049968bf4ec708a5d3d4806e412a42e74160d7f266a3e03a/mysqlclient-1.4.6.tar.gz (85kB)
     |████████████████████████████████| 92kB 845kB/s
Installing collected packages: mysqlclient
  Running setup.py install for mysqlclient ... error
    ERROR: Command errored out with exit status 1:
     command: 'c:\users\akiyoko\work\mysqlclient-test\venv\scripts\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\akiyoko\\AppData\\Local\\Temp\\pip-install-kp34ucod\\mysqlclient\\setup.py'"'"'; __file__='"'"'C:\\Users\\akiyoko\\AppData\\Local\\Temp\\pip-install-kp34ucod\\mysqlclient\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\akiyoko\AppData\Local\Temp\pip-record-3csqetin\install-record.txt' --single-version-externally-managed --compile --install-headers 'c:\users\akiyoko\work\mysqlclient-test\venv\include\site\python3.8\mysqlclient'
         cwd: C:\Users\akiyoko\AppData\Local\Temp\pip-install-kp34ucod\mysqlclient\
    Complete output (30 lines):
    running install
    running build
    running build_py
    creating build
    creating build\lib.win-amd64-3.8
    creating build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\__init__.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\_exceptions.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\compat.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\connections.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\converters.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\cursors.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\release.py -> build\lib.win-amd64-3.8\MySQLdb
    copying MySQLdb\times.py -> build\lib.win-amd64-3.8\MySQLdb
    creating build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\__init__.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\CLIENT.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\CR.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\ER.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\FIELD_TYPE.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    copying MySQLdb\constants\FLAG.py -> build\lib.win-amd64-3.8\MySQLdb\constants
    running build_ext
    building 'MySQLdb._mysql' extension
    creating build\temp.win-amd64-3.8
    creating build\temp.win-amd64-3.8\Release
    creating build\temp.win-amd64-3.8\Release\MySQLdb
    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -Dversion_info=(1,4,6,'final',0) -D__version__=1.4.6 "-IC:\Program Files (x86)\MySQL\MySQL Connector C 6.1\include\mariadb" -Ic:\users\akiyoko\work\mysqlclient-test\venv\include -IC:\Users\akiyoko\AppData\Local\Programs\Python\Python38\include -IC:\Users\akiyoko\AppData\Local\Programs\Python\Python38\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\include" /TcMySQLdb/_mysql.c /Fobuild\temp.win-amd64-3.8\Release\MySQLdb/_mysql.obj /Zl /D_CRT_SECURE_NO_WARNINGS
    _mysql.c
    MySQLdb/_mysql.c(29): fatal error C1083: include ファイルを開けません。'mysql.h':No such file or directory
    error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.25.28610\\bin\\HostX86\\x64\\cl.exe' failed with exit status 2
    ----------------------------------------
ERROR: Command errored out with exit status 1:
    ...(略)...

 

原因

根本原因

同じ環境でも pip のバージョンによって、対応している Python のバージョンと ABIタグの組み合わせが微妙に異なっているということが分かりました。具体的には、バージョン 19.2.3 の前後で

  • pip(バージョン 19.2.2 以前)では、Python バージョン「3.8」に対応する ABIタグは「cp38m」のみ
  • pip(バージョン 19.2.3 以降)では、Python バージョン「3.8」に対応する ABIタグは「cp38」のみ

となっていたのですが、この差は、

github.com

から出てきたものと思われます。
なお、対応している Python バージョンと ABIタグの組み合わせは、

>>> from pip._internal.pep425tags import get_supported
>>> get_supported()

の実行結果から確認可能です。


一方の mysqlclient は、PyPI でソースコード形式と(コンパイル済みの C拡張を含んだ)wheel形式が配布されているのですが、最新バージョンの「1.4.6」では、Pythonバージョン「3.8」と ABIタグ「cp38」の組み合わせに対応する 「mysqlclient‑1.4.6‑cp38‑cp38‑win_amd64.whl」は用意されているものの、Pythonバージョン「3.8」と ABIタグ「cp38m」の組み合わせに対応する「mysqlclient‑1.4.6‑cp38‑cp38m‑win_amd64.whl」は用意されておらず、ソースコードをローカルでビルドしようとしてエラーになっているものと推測されます。 *1

そもそも、wheel形式の配布物が利用できないのが根本原因で、これが利用できれば C++ によるビルドは必要ないはずです。


どうしてこのような状況になるのか?

Python をインストールしたときに合わせてインストールされた pip が古いままになっている(現在は最新の Python 3.8.2 をインストールするとバージョン「19.2.3」の pip が同梱されます)、あるいは、PyCharm 内部で利用されている pip のバージョンが古い(PyCharm 2019.3 では「19.0.3」だったが、最新版の PyCharm 2020.1 では「20.0.2」となっていてこの事象は解消済み)などの状況が考えられます。




*1:非公式ですが、Python Extension Packages for Windows - Christoph Gohlke から確認可能

2019年の akiyoko blog 振り返り

明けましておめでとうございます。
毎年恒例となっている昨年のブログの振り返りから、今年もスタートです。


ちなみに 2018年の振り返りはこんな感じでした。

<過去記事>
akiyoko.hatenablog.jp


2019年の akiyoko blog 振り返り

昨年一年間にアップした記事の本数は 6本で、昨年の 12本から半減しました。2018年に引き続いてずっと Django 本の執筆をしていたからですが、アウトプットの全体量が減ったというわけではありません。カンファレンスやオープンセミナーでの登壇や新人教育、同人誌の頒布など、むしろアウトプットは激増していると思います。

ちなみに、記事の更新頻度が減ったからか、ブログ全体のアクセス数も一昨年の 3/4 ほどに減ってしまっていました。


ブログ記事ごとのアクセス数ランキング(akiyoko blog 2019年)

記事ごとのアクセス数ランキングです。2019年内のアクセス数(*1)ランキング上位 30本をリストアップしています。

なお昨年中に書いた記事 6本中、30位以内に入ったのは 1本のみでした。 *2


# 昨年比 タイトル 作成日 ポイント
1 「プロジェクトマネージャ試験」に一発合格するための三か条 - akiyoko blog 2014/10/26 74.5
2 PyCharm のオレオレ最強設定 - akiyoko blog 2017/03/10 63.4
3 「一対一」「一対多」「多対多」のリレーションを分かりやすく説明する - akiyoko blog 2016/07/31 55.5
4 初学者・初級者向け Django の学習ロードマップ - akiyoko blog 2018/12/01 39.6
5 pandas.DataFrame の列の抽出(射影)および行の抽出(選択)方法まとめ - akiyoko blog 2017/04/03 34.7
6 無料版 PyCharm で Django 開発環境を構築するまでの手順(「現場で使える 基礎 Django」本の補講その2) - akiyoko blog 2018/06/17 30.6
7 IPA「情報セキュリティマネジメント試験」に一夜漬けで合格するためのたった二つの勉強法 - akiyoko blog 2016/11/17 19.8
8 AppStore 登録前の iOSアプリを Ad-Hoc で配布してインストールする方法 - akiyoko blog 2014/08/23 18.6
9 PyCharm で Django の開発をするなら絶対やっておくべき便利な設定 - akiyoko blog 2019/12/06 16.3
10 まだ CSV の文字化けで消耗してるの?(Excel で直接開いても文字化けしない CSVファイルを Python3 で作成するスマートな方法) - akiyoko blog 2017/12/09 15.0
11 Mac の MySQL クライアントに「Sequel Pro」を使っているなら PostgreSQL クライアントは「PSequel」がオススメ - akiyoko blog 2016/07/29 14.7
12 Apple Developer Program の有効期限が切れてしまったときの対処方法 - akiyoko blog 2015/11/13 13.4
13 Django ORM の select_related, prefetch_related の挙動を詳しく調べてみた - akiyoko blog 2016/08/03 11.7
14 matplotlib のグラフに日本語を表示する方法(文字化け対応) - akiyoko blog 2017/04/11 11.3
15 Git で コミットを無かったことにする方法 (git revert の使い方) - akiyoko blog 2014/08/21 11.2
16 Video.js を使って HLS形式の動画をストリーミング再生する - akiyoko blog 2015/08/11 11.0
17 ゼロからはじめる Amazon QuickSight(AWS でお手軽データ分析 その3/3) - akiyoko blog 2017/03/15 10.4
18 GitHub の Wiki に画像を貼り付ける一番簡単な方法(Wiki リポジトリを clone しないバージョン) - akiyoko blog 2016/08/30 9.5
19 Python で MagicMock を使う - akiyoko blog 2015/01/04 8.7
20 Ansible 初心者なら、まずは Ansible Galaxy から始めてみよう - akiyoko blog 2015/12/06 8.4
21 Python でリストのソートまとめ - akiyoko blog 2014/09/26 8.3
22 Pythonで単回帰直線 - akiyoko blog 2013/06/16 7.8
23 Pandas の DataFrame の基本的な使い方 - akiyoko blog 2017/03/27 7.0
24 まだ Moodle で消耗してるの? オープンソースの Python製 LMS「RELATE」が圧倒的にカスタマイズしやくてヤバイぞ! - akiyoko blog 2017/12/19 7.0
25 ゼロからはじめる Django で ECサイト構築(その1:ECパッケージの選定) - akiyoko blog 2016/05/24 6.7
26 JavaScript で配列の添え字に文字列やマイナス値を使ったときの挙動 - akiyoko blog 2015/03/21 6.6
27 Django ORM の SQL を出力する方法まとめ - akiyoko blog 2016/08/04 6.1
28 PyCharm のデータベースツールが最強。ER図も簡単に書き出せるよ - akiyoko blog 2016/03/13 5.7
29 見よ!これが Python製の WordPress風フルスタックCMSフレームワーク「Mezzanine(メザニン)」だ! - akiyoko blog 2015/12/23 5.5
30 「あなたの趣味は?」のアンケート結果を R で因子分析してみた - akiyoko blog 2017/12/04 5.5

かなり前に書いた Python・Django 系の記事がいくつかランキングに返り咲いていたのが興味深いです。


今年の目標

今年は、引き続き Django を盛り上げていくのはもちろんのこと、今執筆している商業誌をしっかりと書き上げることを大目標にしていきたいです。今年もすでにいろいろとイベントが予定されていて忙しそうなのですが、なんとか乗り切っていきたいと思います。

今年もよろしくお願い致します。


f:id:akiyoko:20200103114643p:plain:w350

*1:純粋な PV数ではなく、作成日からの日数で割ったポイントで算出しています。

*2:作成日のところを黄色く塗っています。

PyCharm で Django の開発をするなら絶対やっておくべき便利な設定

この投稿は 「Django Advent Calendar 2019 - Qiita」 6日目の記事です。

Python 開発の IDE には「PyCharm」を激推ししている akiyoko です。
推しの理由は、以下の点が非常に有用だと感じているからです(JetBrains のステマじゃないですよん 😅)。

  • インストールしたそのままの状態で快適に使える
  • venv」(仮想環境を作成するためのモジュール)や「pip」(パッケージ管理ツール)のコマンドの使い方が分からなくても、画面からポチポチと操作できる
  • コードジャンプ機能と自動整形機能を使うことで開発効率が著しく向上する
  • デバッグ実行を使うことでコード解析が捗る


中でもデバッグ実行が便利ですよね。ライブラリの中もどんどん潜ってデバッグ実行できるので、障害解析やコードの理解が格段に捗ります。


Django の開発をする際にももちろん PyCharm を愛用しています。プライベートでは有償版の PyCharm Professional Edition を利用していますが、仕事では無償版の PyCharm CE(Community Edition)を利用しています。



PyCharm の開発元 JetBrains の 昨年の調査 によると、Webアプリ開発をするときは 30〜40%くらいの方が PyCharm(有償版・無償版を合わせて)を利用しているとのこと。私の周りのつよつよ Pythonista の方でも PyCharm を愛用している人は多いです。

この記事を書くにあたって事前に統合開発環境(IDE)の利用状況をアンケートしてみたのですが、

PyCharm の利用率が 30〜40%なのは JetBrains の調査と概ね合致します。
それにしても、VS Code の勢いがすごいですね!
Webアプリ開発ではフロントエンドまわりの面倒も見なくてはいけないことが多々あるので、JS まわりのサポートが弱い PyCharm CE(無償版)よりも、VS Code が選ばれるという状況があるのかなと感じました。皆さま、アンケートにご協力ありがとうございました 🙇‍♂️



前置きが長くなりましたが、ここから本題です。

有償版・無償版を問わず、PyCharm を利用して Django プロジェクトの開発をするなら「これだけはぜひ設定しておいてほしい」という便利な設定があります。


それは、「runserver」の実行(Run / Debug)設定 です。



この設定をすることで、

  • ワンクリックで runserver のデバッグ実行が可能
  • runserver の実行で PyCharm のターミナルツールウィンドウを専有しない

というメリットが得られます。



runserver の実行(Run / Debug)設定

では、その設定方法です。*1


Django プロジェクトのひな型を作成する際に「startproject」コマンドを実行すると、管理コマンドを実行するための「manage.py」が自動生成されますよね。

その「manage.py」を右クリックし、「Create 'manage' ...」を選択(PyCharm 2020.3 では「Modify Run Configuration...」)します。なお、すでにこのプロジェクトで Run / Debug 設定をしたことがある場合は「manage.py」の右クリック時にこの選択肢が表示されないのでご注意ください(その場合は「Run」>「Edit Configurations...」メニューから Run / Debug の設定をおこなってください)。

f:id:akiyoko:20191203080923p:plain

Run / Debug 設定画面が表示されるので、「Parameters」に「runserver」と入力して、「OK」をクリック します。この際、「Name」には、分かりやすいようにたとえば「runserver」と入力しておけばよいでしょう。

f:id:akiyoko:20191203080931p:plain:w500

Run / Debug 設定を済ませると、ナビゲーションバーの右側に「runserver」との表示がされます。

f:id:akiyoko:20191203080957p:plain

「runserver」の右側の虫アイコンをクリックすればデバッグ実行が開始されます。

f:id:akiyoko:20191203081003p:plain:w400


デバッグ実行を開始すると、デバッグツールウィンドウ(Debug タブ)が起動してコンソールにログが出力されます。コードの途中にブレークポイントを置いておけば、コードが実行されたときにそこで中断されて変数などがデバッグができるようになります。

f:id:akiyoko:20191204003907p:plain


デバッグツールウィンドウの使い方については、公式ヘルプの「デバッグツールウィンドウ — PyCharm」を参照してください。



いつもなら runserver を実行するのに

> python manage.py runserver

というコマンドをターミナルツールウィンドウ(Terminal タブ)を使って実行するところを、デバッグ実行はそれとは別のデバッグツールウィンドウ(Debug タブ)上で動作するため、ターミナルのウィンドウを専有することがありません。このため、makemigration、migrate、createsuperuser などの管理コマンドを実行するために、わざわざターミナル上で実行している runserver を停止して、その後 runserver を再実行する・・なんてことをする手間が不要になるのです。


これは便利ですよね〜 😚




おまけ ①

ここで、便利な裏技(?)をひとつ紹介します。

デバッグ実行中にブレークポイントでコードの実行を止めた状態ではデバッグツールウィンドウに「Debugger(デバッガ)」と「Console(コンソール)」という2つのタブが表示されます。ここで、「Console」タブをクリックして、Python ロゴのアイコン(Show Python Prompt)をクリックしてみてください。


f:id:akiyoko:20191205033219p:plain:w550


すると、任意の Python コードが、止めたコード内で実行できるようになります。
ハイ、便利〜 😆


おまけ ②

runserver 実行時にオプションを指定したい場合がありますよね。

そんな場合は、ナビゲーションバー右側の「runserver」をクリックし、「Edit Configurations...」を選択して Run / Debug の設定画面を開きます(「Run」>「Edit Configurations...」メニューからでも開くことができます)。

f:id:akiyoko:20191205041253p:plain:w500


「Parameters」に設定している「runserver」のところを「runserver --settings xxx」などと書き換えることで、実行時のオプションが指定可能です。

f:id:akiyoko:20191205041641p:plain

また、「Environment variables」から「DJANGO_SETTINGS_MODULE」などの環境変数を設定することも可能です。


おまけ ③

runserver の他によく利用する Django の管理コマンドとして、「test」(ユニットテストの実行)があります。

今回紹介した runserver の実行設定と同じようにワンクリックで Django プロジェクトのユニットテストを実行したい場合は、次のように「runserver」の設定をコピーするのが簡単です。

コピーしたら、「Parameters」を「test」に書き換えます(「Name」も適宜「test」などと書き換えます)。

f:id:akiyoko:20191205041944p:plain


あとは、「Run」アイコンか「Debug」アイコンをクリックするだけで Django プロジェクトのユニットテストが実行できるようになります。

f:id:akiyoko:20191205043241p:plain:w500



おまけ ④

ここまでくると、Coverage.py を利用したカバレッジもワンクリックで実行したいですよね。

こんな感じで Run / Debug 設定をすれば OK です。

f:id:akiyoko:20191205042003p:plain

f:id:akiyoko:20191205042020p:plain

ポイントは、「Script path」のところを「Module name」に変更してから、「coverage」と手入力するところですかね(仮想環境下にインストールされた coverage の絶対パスを「Script path」に指定してもよいですが)。もちろん、pip で coverage をインストールしておいてくださいね。

ちなみに、有償版の PyCharm Professional では、PyCharm に内蔵された独自のカバレッジ機能を使ってワンクリックでカバレッジを取得することができます。*2



まとめ

PyCharm で Django の開発をするなら、runserver の実行(Run / Debug)設定をやっておきましょう。

  1. 「manage.py」を右クリックして「Create 'manage' ...」を選択
  2. Run / Debug 設定画面で「Parameters」に「runserver」と入力して「OK」

これだけです。ほんの5分足らず(もしかしたら1分くらいで??)で設定は終わります。

runserver のデバッグ実行をポチッとワンクリック(ショートカットもあります)でスタートできる便利さを味わうと、もう PyCharm から離れられませんよ〜 😙


Enjoy Django & PyCharm !! 😉


f:id:akiyoko:20191206074253p:plain




明日は、nogissh さんの「Django Advent Calendar 2019 - Qiita」7日目の記事です。よろしくお願いします。



 

宣伝

Django の技術同人誌をこれまでに4冊出しました。開発のお供にどうぞ。



現場で使える Django の教科書《基礎編》

「現場で使える Django の教科書」シリーズ第1弾となる Django の技術同人誌。Django を現場で使うための基礎知識やベストプラクティスについて、初心者・初級者向けに解説した本です。B5・本文180ページ。


★ Amazon(電子版/ペーパー版)


★ BOOTH(ペーパー版)



現場で使える Django の教科書《実践編》

《基礎編》の続編にあたる「現場で使える Django の教科書」シリーズの第2弾。認証まわり、ファイルアップロード、ユニットテスト、デプロイ、セキュリティ、高速化など、さらに実践的な内容に踏み込んでいます。現場で Django を本格的に活用したい、あるいはすでに活用している方にピッタリの一冊。B5・本文180ページ。


★ Amazon(電子版)


★ BOOTH(ペーパー版)



現場で使える Django REST Framework の教科書

Django で REST API を構築する際の鉄板ライブラリである「Django REST Framework」(通称「DRF」)にフォーカスした、「現場で使える Django の教科書」シリーズの第3弾。B5・本文204ページ。


★ Amazon(電子版)


★ BOOTH(ペーパー版)



現場で使える Django 管理サイトのつくり方

Django の管理サイト(Django Admin)だけに特化した、ニッチでオンリーワンな一冊。管理サイトをカスタマイズする前に絶対に読んでほしい本です。B5・本文152ページ。


★ Amazon(電子版)


★ BOOTH(ペーパー版)

*1:PyCharm のバージョンは Community Edition(無償版)の「2019.3」(現時点での最新バージョン)です。

*2:ビルトイン開発者用ツール - 機能 | PyCharm

DRF を使うなら必読!『現場で使える Django REST Framework の教科書』を技術書典7 で頒布します


【お知らせ】
2021年3月に第2版に改訂しました。初版から16ページ増の本文220ページとなっています。
(2020.3.15)


booth.pm


9月22日に開催される 技術書典7 に、「あきよこブログ」として 4回目のサークル参加をします。

みなさん安心してください、今回も Django 本ですよ 😁


新刊は『現場で使える Django REST Framework の教科書』です。


f:id:akiyoko:20190908041824p:plain:w400



「Django REST Framework(通称 DRF)」にピンと来ない方がいるかもしれませんが、「Django」の上に乗っかった、API を作ることに特化したライブラリです。つまり DRF は、Python で REST API を作るためのフレームワークです。SPA(シングルページアプリケーション)やスマホアプリのバックエンドとして利用されることが多いです。Django も DRF も日本ではあまり知られていませんが、実は海外では結構有名です。

どんな内容?

技術書典6 で頒布した前作『現場で使える Django REST Framework の薄い本』にかなり大幅な加筆・改訂を加えて、「Django の教科書」シリーズとしてリニューアルしました。前作の124ページに対して、今作は204ページと大ボリュームの仕上がりになっています。

今のところ、同人誌を含めて 日本でオンリーワンの「Django REST Framework」の日本語書籍 になっています。

内容は、Django REST Framework を現場で使う際に必要となる基礎知識と発展的な Tips をまとめたものになっています。なお、Django REST Framework は Django をベースにしている部分があるので、Django についての解説に紙面を割いているところもあります。

前半は DRF の概要や全体像、コンポーネントごとの仕組みや使い方、セキュリティや認証などの基礎知識を座学で進めていきます。後半はチュートリアルおよび発展的な Tips という構成になっています。

後半のチュートリアルでは、Django も Django REST Framework も何にも分からないという方でもちょっとした SPA が作れるように、Django REST Framework と Vue.js を使った SPA のサンプルプロジェクトを2つ、簡単なものと少し難しめなものを用意しました。 これを手本に写経すれば、REST API を使った Webアプリケーションの仕組みが何となく掴めるでしょう。

目次

f:id:akiyoko:20190907201801p:plain:w500
f:id:akiyoko:20190908101706p:plain:w500

対象読者

対象読者としては、

  • Django は何となく分かるが、Django REST Framework は初めてという方
  • Django REST Framework のまとまった日本語情報を手に入れたい方
  • Django REST Framework + Vue.js で SPA を構築したい方
  • 現場で本格的に Django REST Framework を使いたい方

を想定しています。

最低限必要の知識としては「Django の仕組みが何となく理解できていること」です。Django 公式チュートリアルDjango Girls チュートリアル をひと通り終えたくらいであれば、何とか理解できるレベルになっているかと思います。拙著『現場で使える Django の教科書《基礎編》』を読み終えたくらいの知識があれば万全ですが、『現場で使える Django の教科書《実践編》』レベルの知識は不要でしょう。


前作の薄い本と何が違うの?

ざっと挙げるとこんな違いがあります。

  • 本文が204ページに大幅増(前作の124ページから1.6倍!)
  • DRF のコンポーネントの解説が充実
  • ユニットテストの章を新設
  • Tips(発展編)のトピック数が 5 ⇒ 13 に(ページ数は 11p ⇒ 31p)
  • 各種ライブラリは最新バージョンに対応

一番の特徴は、コンポーネントの解説を充実させたことです。「モデル・シリアライザ・ビュー・URLconf」で1つの章になっていたのを、それぞれ独立した章として新設しました。ページ数では、モデル 1p ⇒ 18p、シリアライザ 8p ⇒ 18p、ビュー 14p ⇒ 25p、URLconf 5p ⇒ 8p とそれぞれ大幅に増えています。特に、シリアライザは DRF の中でも大きな部分を占めるので、図を増やしてイチから分かりやすい解説を目指しました。

DRFではシリアライザとビューが特に重要と考えています。シリアライザはフォームと同様に使えるように作られたコンポーネントで、使うのにコツが必要です。一方、DRFのビューはキモの部分で、通常のビューとどう違うのか?どのクラスを継承すればよいのか?を理解する必要があります。新刊を読めばそのあたりもスッキリ理解できるようにいろいろと追記しました。

あと、Django 初心者に少し優しくなりました。特に、前作ではモデルについての説明を「Django と同じ。以上!」としていたのを、きちんと章立てをして解説しています。内容は『現場で使える Django の教科書《基礎編》』からのほぼ抜粋になりますが、スッキリとまとめ直した上で DRF 向けに修正を加えています。

新設した「ユニットテスト」の章もぜひ読んでほしいです。〆切ギリギリで入れるかどうか悩みましたが、教科書としてユニットテストは必須と判断しました。11pと短いながらも、Djangoのユニットテストの特徴やフロー、DRFでの具体的な書き方など、うまくまとめられたと自画自賛しています。

最終章のTips集では、

  • Browsable API
  • APIドキュメント
  • フィルタリング
  • ページネーション

などの機能解説や、

  • 関連モデルの扱い
  • フィールドの追加
  • ネストしたURL
  • カスタムアクション
  • トランザクション
  • 排他制御

など「こんなときはDRFではどうすればいいの?」という疑問にお答えしています。

「Djangoの教科書」シリーズの名に恥じないようDRFの基礎知識やノウハウをできる限り網羅しつつ、DRF初心者にも分かりやすく読めるように書きました。現場でDRFを使っている人、これから使う人の手元に置いてもらえるように頑張って書いたので、とにかく一度、手に取って読んでみていただければと思います。



そして、「そこまで言われても、前作の薄い本買っちゃったしなぁ。どうしよう・・」と悩んでいるあなたに朗報です。

前作『~の薄い本』を技術書典7に持ってきていただいた方、先着50名に、なんとワンコイン(500円)で新刊を買えるサービスを実施します!


f:id:akiyoko:20190908122859p:plain:w400

ただし、お一人様1冊限りでお願いします(薄い本にはスタンプを押させていただきますのでご了承ください)。


頒布本情報

既刊の『現場で使える Django の教科書《基礎編》』『現場で使える Django の教科書《実践編》』を含めて、「Django の教科書」シリーズが3冊揃っています。

なおいつものように「会場特別価格」です。


f:id:akiyoko:20190917121916p:plain:w300


f:id:akiyoko:20190917121947p:plain:w300


実は今回の技術書典に合わせて《実践編》を1年振りにリニューアルして、Django 2.2 対応等をおこないました。


これらの既刊については、Amazon や BOOTH で電子版とペーパー版が販売中です。


◆ 現場で使える Django の教科書《基礎編》 - Amazon(電子版・ペーパー版)

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《基礎編》

◆ 現場で使える Django の教科書《基礎編》 - BOOTH(ペーパー版)
現場で使える Django の教科書《基礎編》【紙の本】 - あきよこブログ(akiyoko blog) - BOOTH


◆ 現場で使える Django の教科書《実践編》 - Amazon(電子版)

現場で使える Django の教科書《実践編》

現場で使える Django の教科書《実践編》

◆ 現場で使える Django の教科書《実践編》 - BOOTH(ペーパー版)
現場で使える Django の教科書《実践編》【紙の本】 - あきよこブログ(akiyoko blog) - BOOTH



頒布場所

日時は 9/22(日)11時から17時まで、頒布場所は池袋サンシャインシティ3F 展示ホール「お74C」の「あきよこブログ」です。

見本誌を置いてますので、立ち読みだけでもお気軽にどうぞ。

f:id:akiyoko:20190917122645p:plain



最後に

余裕をもって始めたはずの執筆ですが、急遽、《実践編》の改訂と増版をしたのもあり、今回もギリギリの入稿になってしまいました。出すものは全部出した感があるので、自分なりにスッキリしています。技術書典当日は晴れやかに迎えられそうです!

DjangoCongress JP 2019 で「現場で使える Django のセキュリティ対策」というタイトルで登壇してきました

akiyoko です。

昨日の DjangoCongress JP 2019(Day 1 カンファレンスデー)で「現場で使える Django のセキュリティ対策」というタイトルで登壇してきました。その報告です。


発表資料は こちら にアップしています。


発表の動機

仕事の現場でもっと Django を使ってほしい という想いから、この発表を思い立ちました。Django 普及の突破口のひとつとして、まずはセキュリティの懸念を取り払うことが重要なのでは?と考えたのです。

Python が企業でも幅広く使われるようになったことや書籍が充実し始めたことで、日本でもようやく Django が注目されるようになりました。4月に待望のバージョン2系の LTS がリリースされ、ますます現場で Django が盛り上がることが予想されますが、導入検討の際にネックになるもののひとつに「セキュリティ」への懸念があります。私は現在、ある Django プロジェクトの立ち上げに携わっているのですが、そこで実際によく言われたのが「Django ってセキュリティ的にどうなん?」 でした。日本では(特に SIer 界隈では)Django がまだあまり知られていないので、そのような疑問が出てくるのは当然といえば当然かもしれません。

一方の開発者からすると、フルスタック(全部入り)の Django にはデフォルトでセキュリティ対策も含まれていますが、そのあたりの理解が中途半端だと、リリースした Webアプリケーションが悪意ある攻撃者の格好の餌食になってしまいかねません。そうならないためにも、Django のセキュリティ事情については開発前から(もちろん開発中でも)きちんと把握しておきたいところです。

そこで今回、IPA(情報処理推進機構)が注意喚起情報として公表している「安全なウェブサイトの作り方」という冊子にまとめられた代表的な脆弱性の概要と、それらの脆弱性に対して Django では具体的にどのような対策をしているのかについて解説することにしました。これによって発注側企業においてはセキュリティの懸念が払拭され、一方の開発側企業においてはセキュリティ施策のヒントとして活用されることを期待しています。

対象者

対象者は、Django の導入を検討している方、および Django を使った Webアプリケーション開発者 を想定しています。なお、Django 初級者の方にも十分理解できる内容になっていると思います。

Webアプリケーションの基本的な知識(特に Cookie を使ったセッション管理や HTTPヘッダなどの知識)があれば、セキュリティの知識についてはほぼゼロ(用語を何となく聞いたことがあるレベル)でも問題ありません。CSRF などの重要な、そして重要な割にあまりよく理解されていないものについては、「CSRF(しーさーふ)って何?」というレベルの人にも分かるように基本から解説しています。

ポイント

メインの話題として

① Webアプリケーションのセキュリティ対策ってそもそも必要なの?
② 「これだけは絶対やっとけ」的な基準はある?
③ フルスタック(全部入り)の Django を使えばセキュリティ対策もまるっと万事解決?

の三点について話しました。
詳細についてはスライドをご覧ください。

発表の準備

昨年の LT でド緊張して失敗した苦い思い出があるので、今回はまず、心構えから入りました。事前に読んだのは、たまたま見つけた オリラジ中田さんの講演会ログ です。要約すると、プレゼンでは「カンペを読まない」「言い訳しない」「練習をサボらない」の3つのタブーがあるということです。中でも、人前で練習をすることが「練習」でそれ以外は「練習」ではない というのはまさにその通りだと思い、リハーサルをなるべく多くこなそうと考えていました。

発表の内容については CFP を出した頃に目次レベルまで固めていたのですが、実際に発表資料を準備し始めたのは仕事の関係もあって GW の終盤からとなりました。しかしこれはちょっと遅すぎました。資料が完成したのは本番5日前。そこから2回、会社の Django 経験者やコンサルタントのメンバーの前、そして現プロジェクトメンバーの前でのリハーサルをおこないました。メンバーからのフィードバック、そして自身の反省から、資料がブラッシュアップされていき、話した方がよいこと・話さなくてよいことが明確になり、想定問答も明らかになって私にとっては良いこと尽くめでした。もっとリハーサルをしたかったのですが、何度も集まってもらうのもメンバーの負担になるのと、直前にフィードバックをもらっても反映できない、余計に混乱してしまうと感じたので、これが限界だったのかも知れません。あとはブツブツ独り言を繰り返し、本番の流れをイメージしていきました。


フィードバックの中で、「図を指差しで説明するよりもレーザーポインターでやった方がいい」と言われて急遽買ったのがこれ。パワポのページ送りもできます。本番前日の夕方に届きました。しかしこれが、当日あのような事件を引き起こすことになろうとは。。


あと、GW 中盤に引いた風邪がずっと長引いていたので体調を整えるために前日夜にマッサージに行ったのですが、強かったのか余計に首を痛めてしまいました。


発表はどうだった?

「発表前にやることリスト」を作っていたので、それを淡々とこなすことで緊張はギリギリのところで抑えられていました。

しかし、プレゼン開始直後に事件が起きました。前日の動作チェックでは問題なかったレーザーポインターがページ送りができなくなり、直前に使用を諦めました。これで緊張のコップから水が少し溢れてしまいました。。


f:id:akiyoko:20190519130935p:plain:w180

この事件がきっかけとなって冒頭の10分はガチガチでした。途中からあきらめの境地に至ってから割と話せるようになったと思いますが、そこで何とか踏み止まれたのも事前のリハーサルのおかげです。あれが無ければもうボロボロの結果になったに違いありません。協力してくださった皆さん、本当にありがとうございました。



質問

想定よりも時間がかかってしまいましたが、発表は42分頃に終わりました。そこで出た質問について補足します。

Q.{% csrf_token %} タグを入れ忘れてしまうのを防ぐ方法はないのか?

POST リクエストを送信する form 要素に {% csrf_token %} タグを入れ忘れると、403 エラーが出ます。しかしながら、CsrfViewMiddleware を無効にするなり @csrf_exempt デコレータを利用したりすると、CSRF 検証はされずに脆弱性が露呈してしまいます。会場では、設定ファイルのセキュリティチェックをしてくれる「python manage.py check --deploy」を実行すれば CsrfViewMiddleware が無効化されていることをチェックできるかも知れないと回答しましたが、それを改めて検証してみました。

実際に CsrfViewMiddleware を「MIDDLEWARE」からコメントアウトして check コマンドを実行すると、期待通りに CsrfViewMiddleware が無効化されているという警告が出ました。

(venv) $ python manage.py check --deploy
...(略)...
?: (security.W003) You don't appear to be using Django's built-in cross-site request forgery protection via the middleware ('django.middleware.csrf.CsrfViewMiddleware' is not in your MIDDLEWARE). Enabling the middleware is the safest approach to ensure you don't leave any holes.


いい感じですね。


反響

いろいろと反響をいただきましたが、一番驚いたのがこれです。


あの徳丸さんにTweetしてもろた!😲マジか!

徳丸さんは、私の発表でも紹介した Webアプリのセキュリティ対策の金字塔「徳丸本」こと『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版』の著者です。現場でも必読書になっています。



あと夕方頃に気付いたのがこちら。Speaker Deck のスライド資料が、はてなブックマークのホットエントリーに入っていたみたいです。


最後に

今年の DjangoCongress JP 2019(Day 1 カンファレンスデー)はセッションもパーティーも大盛況で、大御所イベントのような安定感がありました。これも、ずっと前からこの日のために動いてくれていたスタッフの皆さんの準備、運営、そして情熱のおかげです。本当にありがとうございました。昨年も参加させていただき、そして今年はセッション発表の機会をいただいて、このような素晴らしい場で発表側に回れたことは大変光栄に感じています。おかげさまで昨年のリベンジもできました。またたくさんの方にセッションを聴きに来ていただき、嬉しくそして心強かったです。機会があれば来年もチャレンジしてみたいと思います。




おまけ

じゃんけん大会で一番人気だった『現場で使える Django REST Framework の薄い本』は、BOOTH というオンラインショップから購入可能です(紙の本のみ)。

akiyoko.booth.pm


DjangoCongress に来るくらいの人はもうほとんど持ってる or 知ってるという噂もありますが(笑)、『現場で使える Django の教科書』シリーズ(基礎編・実践編)も BOOTH で購入できます。

akiyoko.booth.pm


『現場で使える Django の教科書』シリーズ(基礎編・実践編)は、Amazon でも販売しています(電子版もあり)。

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《実践編》

現場で使える Django の教科書《実践編》

技術書典6 で『現場で使える Django REST Framework の薄い本』を頒布します

akiyoko です。

本日いよいよ「技術書典6」が開催されますね。私は今回も「あきよこブログ」としてサークル参加します。これで3回連続3回目のサークル参加になります。

f:id:akiyoko:20190413231539p:plain:w400


過去2回で2冊の「Django の薄い本」を出してきましたが、今回の新刊も Django 関連本です。『現場で使える Django REST Framework の薄い本』というタイトルからお分かりの通り、「Django REST Framework(通称「DRF」)」に関する技術同人誌 です。

Django REST Framework(DRF)って何?

「Django」は Python で Webアプリケーションを作成するためのフレームワーク で、Webアプリケーションを作成する際に必要となるコンポーネント(部品)や API を多数提供しています。Django は多数の機能を提供しているものの、REST API バックエンド(REST API を提供する Webアプリケーション)を構築する際のさまざまなニーズに応えるには少し機能が足りず、いろいろと自前で実装しなければいけません。

そこで登場したのが、「Django REST Framework」(以降「DRF」と表記)です。DRF は、REST API バックエンドを構築することに特化したサードパーティ製の Django パッケージ で、REST API を提供する際に必要となる機能や便利な機能を補完・拡充してくれる拡張パックのような役割を果たします。実際のプロジェクトでは、Webアプリケーションのベースとなる機能は Django を利用し、REST API に特化した機能は DRF を利用する、といった使い方をします。


f:id:akiyoko:20190413224931p:plain:w500

DRF 本を書いた理由

かく言う私も現在仕事で「DRF」を使っており、仕事の現場においては「素の Django」よりも「DRF」の方が使われているようにも感じています。しかしながら、DRF に関する日本語情報は Django よりも圧倒的に不足しています。日本語書籍については現在どこを探しても見つかりません。 商業誌を待っていてもあと何年かは出ないだろうから、もし技術書典6に当選したら30ページくらいの本当に薄い本を書いてみようかなと思い立ったのが昨年末。これが地獄の始まりでした。。

それからどうなったか?

技術書典4から3回連続で技術同人誌を頒布していますが、今回が一番辛かったです。昨年末あたりから執筆のための調査を始めていて実質的な執筆は2月から開始したのですが、あれよあれよという間に30ページが50ページになり、70ページになり、最終的には表紙を含めて128ページの「薄くない本」に仕上がってしまった のでした。

毎回執筆内容を Git で管理していて今回からコミットコメントに執筆時間を加えることにしてみたのですが、今回の合計執筆時間は333時間になりました(会場価格は1,000円なので私の作業1時間あたり「3円」で買えてしまうということですね・・)。内容には満足しているものの、3月は生活のすべてを投げ打って執筆に没頭してしまいました。ご迷惑をお掛けした関係各所の皆さま、本当に申し訳ありませんでした。最後に、家族のサポートがなければこの本は世に出ていなかったということも付け加えさせてください。

どんな内容?

Django REST Framework(DRF)を現場で使う際に必要となる基礎知識についてまとめた技術同人誌で、本文124ページ、まるまる「Django REST Framework」に関する本 です。なお、DRF は Django をベースにしている部分があるので Django についての解説は要所要所で書いているものの、Python についての解説は一切ありませんのでご注意ください。

前半は DRF の概要や全体像、コンポーネントごとの仕組みや使い方、セキュリティや認証などの基礎知識を座学で進めていきます。後半はチュートリアルおよび発展的な Tips という構成になっています。

後半のチュートリアルでは、Django も Django REST Framework も何にも分からないという方でもちょっとした SPA が作れるように、Django REST Framework と Vue.js を使った SPA のサンプルプロジェクトを2つ、簡単なものと少し難しめなものを用意しました。 これを手本に写経すれば、REST API を使った Webアプリケーションの仕組みが何となく掴めるでしょう。


レビュアーとして、くろのて勉強会 を主催をしている @crohaco さんにもご協力いただいたのですが、@crohaco さんからお墨付きをいただけました。DRF の勉強会ではお世話になりました。そしてレビューありがとうございました。

そのほか、Django 系イベントでいつも会う @kaizumaki さんや u1 さんにもレビューをしていただきました。ありがとうございました!

対象読者

対象読者としては、

  • Django は何となく分かるが、Django REST Framework は初めてという方
  • Django REST Framework のまとまった日本語情報を手に入れたい方
  • Django REST Framework + Vue.js で SPA を構築したい方
  • 現場で本格的に Django REST Framework を使いたい方

を想定しています。

最低限必要の知識としては「Django の仕組みが何となく理解できていること」です。Django 公式チュートリアルDjango Girls チュートリアル をひと通り終えたくらいであれば、何とか理解できるレベルになっているかと思います。拙著『現場で使える Django の教科書《基礎編》』を読み終えたくらいの知識があれば万全ですが、『現場で使える Django の教科書《実践編》』レベルの知識は不要でしょう。


現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《実践編》

現場で使える Django の教科書《実践編》


目次

気になる目次は ↓ のようになっています。


はじめに
第1章: Django REST Framework(DRF)の概要
第2章: モデル・シリアライザ・ビュー・URLconf の基本的な使い方
第3章: DRF とセキュリティ
第4章: DRF と認証
第5章: チュートリアル その1: DRF + CDN 版 Vue.js で Cookie 認証付き SPA をスピード構築
第6章: チュートリアル その2: DRF + Vue CLI 3 で JWT 認証付き SPA を本格構築
第7章: 現場で使える Tips 集
おわりに


f:id:akiyoko:20190413231404p:plain:w300


頒布本情報

当日のお品書きを作りました。
お釣りがなるべく出ないように考慮した「会場特別価格」です。

f:id:akiyoko:20190413231539p:plain:w400



あと、既刊の『現場で使える Django の教科書《基礎編》』『現場で使える Django の教科書《実践編》』も持っていきます。

f:id:akiyoko:20190413231654p:plain:w400

f:id:akiyoko:20190413231728p:plain:w400

これらの既刊については、Amazon や BOOTH で電子版とペーパー版が絶賛販売中です。


◆ 現場で使える Django の教科書《基礎編》 - Amazon(電子版・ペーパー版)

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《基礎編》

◆ 現場で使える Django の教科書《実践編》 - Amazon(電子版)

現場で使える Django の教科書《実践編》

現場で使える Django の教科書《実践編》

◆ 現場で使える Django の教科書《実践編》 - BOOTH(ペーパー版)
現場で使える Django の教科書《実践編》【紙の本】(技術書典5バージョン) - あきよこブログ(akiyoko - BOOTH

頒布場所

頒布場所は「か63」の「あきよこブログ」です。
見本誌を置いてますので、立ち読みだけでもお気軽にどうぞ。

f:id:akiyoko:20190413232620p:plain

池袋サンシャインシティ2F、4/14(日) 11時オープンです。今回は、会場2時間は有料入場券(1,000円)が必要になっています。それでも午前中は混雑すると思いますのでご注意ください。

なお勝手ながら、当日13時までの有料入場者特典として、弊ブースにて『現場で使えるDjangoの教科書《実践編》』(紙の本)を会場特別価格からさらに500円引きさせていただきます(1,500円→1,000円)。(後払いアプリだと対応できないかもしれないので)現金払いのみでの割引とさせてください。



最後に

ウチの奥さんに「そんなに寝てないと死ぬよ?」と何度も言われながら、ようやく今週の火曜にすべり込み入稿できました。表紙がモノクロだったので標準価格からのアップは免れましたが、カラーだったらアウトというギリギリっぷりでした。そんな感じで今回の執筆で気力体力ともに尽き果てました。今日の技術書典が終わったら昇天しているかもしれません。。

仕事で本格的に Django を使うなら『現場で使える Django の教科書《実践編》』がオススメ!

akiyoko です。

昨年10月の 技術書典5 で Django の技術同人誌シリーズの2作目となる新刊 『現場で使える Django の教科書《実践編》』 を出してから数ヶ月経ちました。その間、Django 本の読書会 をしたり、Amazon で電子版の販売を開始したり、年末のコミケに初参加してサークル「あきよこブログ」として本を再販したりするなど、いろいろとイベントが目白押しでした。

そうやって技術書典5 からの数ヶ月を忙しく過ごしたわけですが、ふと思い返すと私のブログで《実践編》の内容を紹介していなかったことに最近気づいたので、この記事で 『現場で使える Django の教科書《実践編》』の概要と読みどころ について紹介しておきたいと思います。


f:id:akiyoko:20180930140739p:plain:w200

現在、《実践編》の紙の本はオンラインショップの 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 証明書発行


f:id:akiyoko:20180930140511p:plain:w250

f:id:akiyoko:20180930140547p:plain:w250


第2章:開発のヒント(認証まわりをサクッと実装)

Django を使った Webアプリ実装の第一歩として、まず「ユーザー認証まわり」から実装することが多かったりする のではないでしょうか。実は、Django 組み込みの認証システムを使うと、認証まわりの機能をサクッと実装することができます。そのことを知らずに、ログインやパスワード変更といった機能を自前で実装してしまったりするのは「DRY(Don’t repeat yourself)」の原則に反します。しかしながら、認証まわりのノウハウについてまるっと解説した本は(少なくとも日本語の書籍では)ありませんでした。

本章ではまず、最小限の実装でユーザー認証まわりの機能をひと揃えするための具体的な方法について解説 をしています。


しかし実際の現場では、サクッと実装しただけでは問題がある場合があります。それは「仕様変更」です。Django デフォルトの認証の仕組みをそのまま利用できる場合はよいのですが、ちょっとカスタマイズしたいとなった場合に難易度が途端に跳ね上がるという点には注意が必要でしょう。たとえば、「ユーザー名ではなくメールアドレスとパスワードで認証できるようにしたい」といったニーズは日常茶飯事に発生します。このような場合にどのように改修すればよいのか、その改修ポイントや具体的なコードを載せています。


本章の最後ではさらに実践的なニーズのひとつである「ソーシャル連携認証」について解説をしています。これを読めば、「OAuth って何?」というレベルの方でも、ソーシャル連携認証の仕組みが分かるようになり、GitHub アカウントでソーシャル認証ログインできる Django サイトが実装できるようになります。

第3章:開発のヒント(Bootstrap 4 対応)

ところで皆さんは「味覇(ウェイパー)」という調味料をご存知ですか?

味覇(ウェイパー) 缶 500g

味覇(ウェイパー) 缶 500g

  • メディア: 食品&飲料

味覇は中華料理のベースの味付けに「とりあえず使っとけ」という感じで万能・安心・簡単に使える調味料なのですが、「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レスポンスを応用すればこんなアプリが作れるぞ!というちょっとしたアプリのコードを紹介しています。時系列データを保持した pandasDataFrame を JSONレスポンスとして返し、テンプレート側では「Tabulator」という JavaScript のライブラリを利⽤して JSON を処理するというサンプルになっています。はっきり言って、ポエムです。

f:id:akiyoko:20181021163655p:plain:w450

第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 の教科書《実践編》』の評価を勝手に掲載させていただきます。


https://ks6088ts.github.io/post/20190104_djangobook/ks6088ts.github.io


まとめ

おかげさまで、前作の Django の技術同人誌『現場で使える Django の教科書《基礎編》』は まだまだ販売好調で、販売累計数は 2,500冊を超えています。 こちらも Django プロジェクトの現場にあると嬉しい一冊ではありますが、どちらかというと、現場に入った新規参画者や新人に読んでほしい初心者・初級者向けの一冊になっていると思います。


◆『現場で使える Django の教科書《基礎編》』Amazon(電子版/ペーパーバック版)

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《基礎編》

  • 作者:横瀬 明仁
  • 発売日: 2018/08/26
  • メディア: オンデマンド (ペーパーバック)



基礎編を読み終えて、仕事でもっと本格的に使っていこうと考えているなら、今回紹介した『現場で使える Django の教科書《実践編》』が絶対オススメです。 何かで詰まって半日無駄にするくらいなら、《実践編》を一冊買う方が絶対安いです。きっと役に立つ情報がたくさん載っていると思います。特に、デプロイや高速化、セキュリティ、認証、ユニットテストに関しては、これほどまとまった情報を提供しているところは他にはまだないと自負しています。

気になった方はこの機会に《実践編》をぜひどうぞ。


f:id:akiyoko:20190120144009p:plain


なお、紙の本で『現場で使える Django の教科書』シリーズの二冊(基礎編・実践編)をお得に手に入れたいという方には、BOOTH での二冊セット販売も用意しています。

booth.pm