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.py
のINSTALLED_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