DjangoBrothers BLOG ✍️

2020/11/03

このエントリーをはてなブックマークに追加
Django デバッグ django-debug-toolbar

django-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_CONFIGSHOW_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の動作確認とかがサクッとできて便利です(参考)。

関連記事