2020/11/03
Django デバッグ django-debug-toolbardjango-debug-toolbarを導入してデバッグの効率を上げる
動作確認済のバージョン
django-debug-toolbar==3.1
Django==2.2.17, 3.1.2
django-debug-toolbarを導入すると、以下のような情報がブラウザ上に表示されるので、開発効率を上げることができます。
- 使用しているライブラリ一覧とそのバージョン情報
- 設定ファイルで設定されている値(settings.pyに定義されている値 + デフォルトで定義されている値)
- リクエスト・レスポンスのヘッダ情報
- ページ表示時に発行されるSQL文、実行時間、発行回数
- 読み込まれている静的ファイルの情報
- テンプレート情報(HTMLファイル名やコンテキスト情報)
- キャッシュ情報
- シグナル情報
django-debug-toolbarの導入方法
まずはpipでインストールします。
インストール
$ pip3 install django-debug-toolbar==3.1
settings.pyに必要な設定を追加します。以下で追加している項目は、DEBUG=Trueのときだけ必要なものなので、設定ファイルを本番・開発用で分けたりしている場合は「開発用」の方にだけ追加すればOKです。
settings.py
INSTALLED_APPS = [
# ...
'django.contrib.staticfiles', # (デフォルトで存在する)
# ...
'debug_toolbar', # 追加
]
STATIC_URL = '/static/'
MIDDLEWARE = [
# ...
'debug_toolbar.middleware.DebugToolbarMiddleware', # 追加
]
# 追加
INTERNAL_IPS = ['127.0.0.1']
# 追加
DEBUG_TOOLBAR_CONFIG = {
"SHOW_TOOLBAR_CALLBACK" : lambda request: True,
}
INTERNAL_IPSには接続元のIPを指定します。基本的には'127.0.0.1'
で良いと思いますが、場合によっては'127.0.0.1'
ではツールバーが表示されないことがあります。その場合はview関数内などで、request.META.get('REMOTE_ADDR')
とすると接続元のIPを取得できるので、取得したIPをINTERNAL_IPSに指定します。
views.pyで接続元IPを取得する例
def index(request):
# ...
ip = request.META.get('REMOTE_ADDR') # これで取得できたIPをINTERNAL_IPSに追加する
return render(request, 'index.html', {"ip": ip})
IPに関わらず、必ず実行できるようにしたい場合は上記例のようにDEBUG_TOOLBAR_CONFIGのSHOW_TOOLBAR_CALLBACKに必ずTrueを返す関数を指定すれば良いです。SHOW_TOOLBAR_CALLBACKはデフォルトだとshow_toolbar関数が設定されています。
MIDDLEWARE追加の注意点として、「デバッグツールバーのmiddlewareは、リストのなるべく上に書くのが良いけど、 GZipMiddlewareのようなレスポンスコンテンツをエンコードするミドルウェアよりは下に書かないといけない」らしいです。
次に、urls.pyのurlpatternsにpathを追加します。
urls.py
import debug_toolbar # 追加
urlpatterns = [
# ...
]
# 追加 '__debug__/'は他のURLに影響を及ぼさないならなんでも良い
if settings.DEBUG:
urlpatterns += [path('__debug__/', include(debug_toolbar.urls))]
ここまでの設定ができると、ブラウザの右側にバーが表示されます。見たい項目をクリックすることでステータスを確認できます。
ツールバーのカスタマイズ
DEBUG_TOOLBAR_PANELS
という変数で、ツールバーに表示したい項目を定義することがでできます。
settings.py
DEBUG_TOOLBAR_PANELS = [
'debug_toolbar.panels.versions.VersionsPanel',
'debug_toolbar.panels.timer.TimerPanel',
'debug_toolbar.panels.settings.SettingsPanel',
'debug_toolbar.panels.headers.HeadersPanel',
'debug_toolbar.panels.request.RequestPanel',
'debug_toolbar.panels.sql.SQLPanel',
'debug_toolbar.panels.staticfiles.StaticFilesPanel',
'debug_toolbar.panels.templates.TemplatesPanel',
'debug_toolbar.panels.cache.CachePanel',
'debug_toolbar.panels.signals.SignalsPanel',
'debug_toolbar.panels.logging.LoggingPanel',
'debug_toolbar.panels.redirects.RedirectsPanel',
'debug_toolbar.panels.profiling.ProfilingPanel',
]
例えば、「時刻」情報は表示する必要がないと思うならば'debug_toolbar.panels.timer.TimerPanel',
を消せば良いです。
debugsqlshellでSQL情報を確認
Djangoではpython manage.py shell
でシェルモードを起動し、クエリセットの確認などができますがデバッグツールバーを入れるとpython manage.py debugsqlshell
コマンドも使えるようになります。
このコマンドでシェルを起動すると、SQLの情報も出力されます。
debugsqlshellを使ってSQL情報を確認
$ python manage.py debugsqlshell
>>> from app.models import Article
>>> Article.objects.all()
SELECT "app_article"."id",
"app_article"."title",
"app_article"."text"
FROM "app_article"
LIMIT 21 [2.23ms]
<QuerySet []>
select_related
の動作確認とかがサクッとできて便利です(参考)。