Django歴約3年のエンジニアが今使っているライブラリを紹介してみる

この記事は [Django Advent Calender 2016](http://qiita.com/advent-calendar/2016/django)の 10日目の記事です。

こんにちは！ 現職でDjangoを使いはじめて、約3年のエンジニアです。今回は自分自身の知識の整理の意味も兼ねて、今使っているDjango関連ライブラリの紹介をしたいと思います。

## 静的ファイル配信
### django-storages
https://pypi.python.org/pypi/django-storages

Amazon S3などのCDNで静的ファイルを配信するためのライブラリ。
なかなかPython3対応されなくて[django-storages-redux](https://pypi.python.org/pypi/django-storages-redux)というfork版が生まれたこともありますが、現在は最新の3.5まで対応しています。
最近では[whitenoise](https://pypi.python.org/pypi/whitenoise/3.2.2)も人気があるようで、試してみて良かったら乗り換えてみようかと思っています。

### django-compressor
https://pypi.python.org/pypi/django_compressor/2.1

複数のcss、jsファイルを一個にまとめてくれるライブラリです。中身をインラインに埋め込んだり、改行やコメントを覗いてデータ転送量を減らしてくれる機能もあります。
また、altJSやSass(SCSS)などのコンパイラと組み合わせることもできます。

### easy-thumbnails
https://pypi.python.org/pypi/easy-thumbnails/2.3

いわゆる「サムネイル画像」を生成してくれるライブラリです。サムネイル画像の元になる画像が消された場合、サムネイル画像だけゴミとして残ってしまうので、`thumbnail_cleanup`コマンドで定期的に消してやる必要があります。


## 検索
### django-haystack
https://pypi.python.org/pypi/django-haystack/2.5.1
Elasticsearchで位置情報を行うために使っています。
位置情報を使う際は、`libgeoip`をインストールした環境でないと検索ができません。

## 開発作業を便利にするコマンド追加 & よく書くパターンのコード簡潔にする
### django-extensions
https://pypi.python.org/pypi/django-extensions/1.7.5

Djangoの諸々の機能をさらにパワーアップさせる、「かゆいところに手が届く」という感じのライブラリです。以下のコマンドが特にお気に入りです。

- `runserver_plus`コマンド
    - エラー発生時にスタックトレースの任意の行でコード実行ができる。
- `shell_plus`コマンド
    - モデルクラスや `from django.conf import settings`など、よく使うimport文が予め実行された状態で`shell`が開始される。

### django-formtools
https://pypi.python.org/pypi/django-formtools/1.0

お問い合せフォームなどによくある「入力」→「確認」→「送信」の動きを実現するためのライブラリです。
元々はDjango本体に組み込まれていましたが、1.8から独立化しました。

### django-model-utils
https://pypi.python.org/pypi/django-model-utils/2.6

モデル設計でよく使われるパターンを簡潔に書けるようにできるライブラリです。
[StatusField](https://django-model-utils.readthedocs.io/en/latest/fields.html#statusfield)、または[Choices](http://django-model-utils.readthedocs.io/en/latest/utilities.html#choices)クラスは、「ステータス」のような予め決まった値しか入力できないフィールドを作る際に、普通に`choices`属性にタプルを渡すよりすっきりした書き方になるのでよく使っています。

### django-braces
https://pypi.python.org/pypi/django-braces

Class-based viewsのミックスインクラスをまとめたライブラリです。
開発を始める前に[ドキュメント](https://django-braces.readthedocs.io/en/latest/index.html)をよく読んでおくと、楽に開発が進められます。
なお、[LoginRequiredMixin](https://django-braces.readthedocs.io/en/latest/access.html#loginrequiredmixin)については、Django1.9から標準で[LoginRequiredMixin](https://docs.djangoproject.com/en/dev/topics/auth/default/#the-loginrequired-mixin)ができたので、標準を使っておいたほうがいいでしょう。

### django-debug-toolbar
https://pypi.python.org/pypi/django-debug-toolbar/1.6

ブラウザの画面右側にデバッグ用のツールバーが表示されるようになるライブラリです。
ログの出力内容や、DBに投げられたクエリを確認するのに役立ちます。
また、シェル上からのモデル操作で投げられるクエリの解析をやってくれる、`debugsqlshell`という便利コマンドもあります。

### django-haystack-panel
https://pypi.python.org/pypi/django-haystack-panel/0.2.1

django-debug-toolbarの拡張で、django-haystackから投げられたクエリの解析を行ってくれます。

## REST API
### djangorestframework
https://pypi.python.org/pypi/djangorestframework/3.5.3

DjangoでREST APIを提供するサービスを作るなら定番のライブラリ。
かなり高機能なので、作りたいものによっては、先に紹介したdjango-bracesの[JSONResponseMixin](https://django-braces.readthedocs.io/en/latest/other.html#jsonresponsemixin)、[JsonRequestResponseMixin](https://django-braces.readthedocs.io/en/latest/other.html#jsonrequestresponsemixin)、[AjaxResponseMixin](https://django-braces.readthedocs.io/en/latest/other.html#ajaxresponsemixin)を使ったほうがいいでしょう。

## キャッシュ
### django-fancy-cache
https://pypi.python.org/pypi/django-fancy-cache

「このデータが更新されたときに特定のページキャッシュを消す」のようなことするためのライブラリです。（標準のページキャッシュは意外にもそういうことできないんですよね…）

## セキュリティ
### django-axes
https://pypi.python.org/pypi/django-axes

一定回数ログインに失敗するとログイン画面をしばらく凍結してくれるようになるライブラリです。ブルートフォース（or リバースブルートフォース）でアカウントを盗もうとするボット対策で導入しています。
凍結時にWARNレベルでログを吐くので、メールやSlackなどで通知させるようにして、しつこくリトライしてくるIPアドレスはファイアウォールでブロックする方針です。

### django-password-validation
https://pypi.python.org/pypi/django-password-validation

パスワード登録・更新時に、ある程度複雑なパスワードを強制するようにできます。
Django1.9から導入された[Password validation]
(https://docs.djangoproject.com/en/dev/topics/auth/passwords/#password-validation)を1.8以前にバックポートしたライブラリです。今手がけているサービスは1.8を使っているので導入しました。

## その他参考になるサイト
cookiecutter-djangoというDjangoのプロジェクトテンプレートの[requirements以下](https://github.com/pydanny/cookiecutter-django/tree/master/%7B%7Bcookiecutter.project_slug%7D%7D/requirements)はざっと読んでおくことをお勧めします。[^1]
https://github.com/pydanny/cookiecutter-django

[^1]: ちなみにcookiecutter-djangoは5日目の@aki_yokさんが[紹介している](http://akiyoko.hatenablog.jp/entry/2016/12/05/023834)「Two Scoops of Django: Best Practices for Django 1.8」にも載っている、お勧めのテンプレートです。