0
0

Djangoでデバッグしたい

Last updated at Posted at 2024-09-25

Djangoわからない
デバッグどうするの?
と思っていた頃、生き残りをかけた戦いの末、有用だった小技をまとめました。

show_urls | プロジェクト内で定義されているURLパターンを一覧表示

標準のDjangoには含まれておらず、django-extensionsパッケージを導入するか、カスタム管理コマンドとして実装する必要があるのですが、Djangoプロジェクト内で定義されているURLパターンを一覧表示できるのでめちゃくちゃ便利です。

ブロジェクトの処理の流れを追う時やAPIのエンドポイントを追うときに非常に役立ちます。

django-extensionsパッケージをインストール

$ pip install django-extensions

settings.pyにdjango-extensionsをインストール済みアプリとして追加します。

INSTALLED_APPS = [
    # 他のアプリ
    'django_extensions',
]

インストールできたらターミナルで以下のようにshow_urlsコマンドを使って、DjangoプロジェクトのすべてのURLパターンを一覧表示できます。そのままだと本当に定義されている全てが出てきてしまってターミナルがすごいことになりますが、grepと一緒に使って自分の調べている処理に使っているurlモジュールを絞り込み検索するとすごく便利です。

$ python manage.py show_urls | grep 検索キーワード

出力結果は以下のように出てきます。

^admin/                              django.contrib.admin.sites.admin_view
^$                                   myapp.views.home_page
^about/$                             myapp.views.about_page
...

Django Debug Toolbar | Djangoテンプレートが調べられる

DjangoってHTMLの代わりにDjangoテンプレートを使用すると思うのですが、どのテンプレートが使われてるのかわからない時、このツールを使うと簡単に調べられます。

多分、基本的にはプロジェクトにすでに入っていると思いますが、入っていない時は公式ドキュメントを参考に設定しましょう。

入っているかどうかは'debug_toolbar',をエディタの全コード検索で検索してみてください。settings.pyINSTALLED_APPS =に入っていると思います。

他にも以下を調べられます。

  • SQLクエリの詳細
    ページのレンダリング中に実行されたすべてのSQLクエリが表示され、どのクエリがどれだけの時間を消費したかも確認できます。重複したクエリや非効率なクエリを見つけるのに役立ちます。

  • リクエストとレスポンスの情報
    HTTPリクエストやレスポンスのヘッダーや内容、セッション情報、GET/POSTデータなどが確認できます。
    キャッシュのヒット/ミス情報:
    キャッシュされたデータが適切にヒットしているかどうかの情報を確認できます。

  • ミドルウェアの実行時間
    どのミドルウェアがどれだけの時間を消費しているかが確認でき、パフォーマンス改善に役立ちます。

  • 静的ファイルの詳細
    静的ファイルに関連する情報や、適切に読み込まれているかの確認が可能です。

  • Djangoテンプレートのレンダリング情報
    使用されたテンプレートや、それぞれのテンプレートでどのデータが渡されたか、レンダリングにかかった時間などが表示されます。

本当にこのメソッドを使ってるのか?を調べる

return を使う

    def hoge_method(self, request):
      print("使われているのはhoge_methodでした")
      return  # 処理をここで終了する

HTTPメソッドを行っているviewメソッドだと、以下のように書くとエラーみたいな出力がされないで、いい感じにHttpResponseの引数に入れた文字列が画面に表示されます。

    def hoge_method(self, request):
    print("使われているのはhoge_deleteでした")

    # 処理を中断し、デバッグメッセージを表示した後、ダミーのレスポンスを返す
    return HttpResponse("デバッグ用: この時点で処理が停止しました。")

exit() を使う

さっきのexitは、エラーぽくログ出力されて怖いので、returnの方が気持ちも楽かもしれません。
exitを使って処理を止める為に、exit()を入れ込む

    def hoge_method(self, request):
        exit()  # ここで処理が終了する

exit()を入れると以下のようにDjangoサーバーを動かしてるターミナルに以下のように出力がされます。

"honntara.py", line 610, in member_delete
    exit()  # ここで処理が終了する
  File "_sitebuiltins.py", line 26, in __call__
    raise SystemExit(code)
SystemExit: None
0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0