Djangoの本番運用で困った — admin・デバッグ・ロギング・高速化 — の解決策

 Djangoは7~8年前、バージョンが1.xで、Python2.xが推奨されていた時代から愛用していたけれど、ほとんど悩まされることはなかったように思います。

 でも、そのままでは困ったこともありました。以下の3つです。

  1. admin.py
  2. デバッグログ
  3. 高速化(主にプロファイラー)

 これらの暫定的な解決策について簡単にまとめておきます。勉強の段階やテスト段階ではあまり関係ないかもしれないですが、Django で本格的なサービスを作るなら必ず役に立つと思います。

1. admin.py

 お分かりでしょうが、モデルを追加する度に admin.py を書くのは面倒だってことです。

 一応解決策としては、 django-extensions という Python パッケージの admin_generator コマンドを使えば自動生成が可能です。

 それでも面倒なので、デフォルトで全て追加して、もし表示したくないものがあれば引き算する形にしてほしいものです。

 

2. デバッグログ

 エラーログは当然表示されるのですが、デバッグログはデフォルトで出力してくれません。本番環境でバグが発生した時など、View 内の変数やロジックを確認したいことがよくありました。
 しかも、ライブラリによってデバッグログを出力してくれるものがあるので、設定しておいて絶対に損しないと思います。(特に requests 等の外部と通信するもの)

 

gist.github.com

 

 公式のドキュメントやネットで見つかる方法では settings.py に LOGGING を記述するが、やたらと長いので読む気が失せました。上のPythonの出力レベルを変更するだけのコードならば、ファイル保存こそしてくれないですけど、DEBUG レベルまでちゃんと出力してくれます。ファイル保存は WSGI などを用いてデプロイしていれば、そっち側で出力をロギングできるので全く問題ありません。 


3. 高速化(主にプロファイラー)

 最後は高速化の問題です。これが結構困ったもので、Django には遅くなる要素がたくさんあります。ちょっと多めに処理を書くとすぐ遅くなります。

 第一の選択肢は、公式が用意している解答でもある memcached です。簡単に設定できて、メインメモリー上にキャッシュするのでバカ早くなります。ただ、キャッシュはキャッシュなので、URLが同じで内容が頻繁に変わるようなものには少し工夫が必要になります。

 他にも遅くなる要素とその対策があると思います。

 ですが、そもそもボトルネックを探ったり、高速化を進めていく指標をみたりするための、プロファイラーが標準で備わっていないのが問題ではないでしょうか。

 そこで私は Pythonパッケージの Django Debug Toolbar を導入しています。

 

f:id:mugrumat:20210717101959p:plain

出典 https://github.com/jazzband/django-debug-toolbar

 CPU 全体や SQL はもちろん、加えて django-debug-toolbar-template-profiler を採用すれば 、Template の処理時間もわかります。

 SQL の高速化はよほどのミスがない限り Django 側でできることは少ない(そもそもそれを自動ですることが Django の役割の一つだとも言えます)ですが、意外と Template の負荷は小さくないとわかったりするので、memcached を採用したり、context を変更したりといった策が取れます。

 一つ注意しなければいけないとすれば、JSON をレスポンスする時は、加えて django-debug-toolbar-force を採用しなければ表示されないということくらいでしょうか。

 実は、該当 View に限ってデバッグログも表示されるようになるので、合わせて採用することで Django 開発は格段に楽になります。もはや必須と言ってもいいでしょう!(終)