デバッグは開発において避けられない部分であり、効果的に行うことで数時間(または数日)ものフラストレーションを節約できます。Djangoを使用している場合、良いニュースは、フレームワークとPythonのツールおよびコミュニティリソースを組み合わせることで、スマートで効率的にデバッグするために必要なものがすべて揃っていることです。

この投稿では、シンプルなテクニックからプロが使用する強力なツールまで、Djangoアプリケーションをデバッグするための最良の方法を探ります。

1. pdb - Pythonの組み込みデバッガーを使用する

コードを一時停止して検査する最も古典的で推奨される方法は、以下を挿入することです。

インタープリターがこの行に到達すると、対話型シェルが開き、そこで以下を行うことができます。

  • 変数の値を表示する
     

  • コードをステップ実行する(nは次へ、sはステップイン、cは続行)
     

  • デバッグを終了する(qで終了)

ボーナス:Python 3.7以降では、よりクリーンな:

breakpoint()

を使用できます。これはpdb.set_trace()と同じように動作します。

2. ロギングを追加する - printのクリーンな代替手段

print()は迅速なチェックに役立ちますが、Pythonのloggingモジュールを使用する方が柔軟性があり、本番環境でも使いやすいです。

設定例:

import logging
logger = logging.getLogger(__name__)

logger.debug("Debug message")
logger.info("Information")
logger.error("Something went wrong")

settings.pyでログレベルとハンドラーを設定して、ログをコンソール、ファイル、または外部サービスに出力できます。

3. Djangoの組み込みデバッグモードを有効にする

開発環境でDEBUG = Trueであることを確認してください。

これが有効になっていると、Djangoはスタックトレース、ローカル変数、および役立つコンテキストを含む詳細なエラーページを表示します。

⚠️ 本番環境でDEBUGを有効にしないでください!

4. Django Debug Toolbarをインストールする

Djangoアプリケーションを視覚的かつ対話的にデバッグするには、Django Debug Toolbarをインストールします。

これにより、以下が表示されます。

  • SQLクエリと実行時間
     

  • テンプレートコンテキスト
     

  • リクエストヘッダーとシグナル
     

  • キャッシュの使用状況、静的ファイルなど

インストール:

pip install django-debug-toolbar

INSTALLED_APPSとMIDDLEWAREに追加し、そのURLを含めます。これで、ブラウザにすべてのページにパネルが表示されます。

5. Djangoのテストクライアントを使用してビューをテストする

ビューを独立してテストしたい場合があります。

Djangoの組み込みテストクライアントを使用すると、HTTPリクエストをシミュレートできます。

from django.test import Client
client = Client()
response = client.get('/your-url/')
print(response.content)

ブラウザを開かずにAPIとビューをデバッグするのに最適です。

6. django-extensionsからshell_plusを使用する

もう1つのプロツールはshell_plusであり、django-extensionsパッケージからの拡張された対話型シェルです。モデル、設定を自動的にインポートし、ORMクエリや関数呼び出しを簡単にテストできます。

インストール:

pip install django-extensions

INSTALLED_APPSに追加して、実行します。

python manage.py shell_plus

7. カスタムデバッグミドルウェアを作成する

リクエスト全体で特定の問題を突き止めたい場合があります。独自のミドルウェアを作成すると、以下をログに記録できます。

  • 着信リクエスト
     

  • レスポンス
     

  • エラー

ミドルウェアの例:

class SimpleLogMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        print(f"Request Path: {request.path}")
        response = self.get_response(request)
        print(f"Response Status: {response.status_code}")
        return response

本番環境で検出困難なバグを追跡するのに役立ちます(ログに記録する内容には注意してください!)。

結論:適切なツールを適切な仕事に選択する

シナリオ ツール
コードを一時停止して検査する必要がある pdb / breakpoint()
視覚的なデバッグインターフェースが必要 Django Debug Toolbar
ロギングと監視 loggingモジュール
ビューの動作をテストする Django Test Client
対話型のモデルテスト shell_plus
カスタムリクエストロギングが必要 ミドルウェア

プロのヒント:

「デバッグとは、あなたが犯人でもある犯罪映画の探偵のようなものです。」
– Filipe Fortes

楽しいデバッグを!

質問と回答

Djangoのコードを一時停止して変数を検査する最良の方法は何ですか?

コードにimport pdb; pdb.set_trace()を挿入することで、Pythonの組み込みデバッガーpdbを使用できます。Python 3.7以降では、breakpoint()を使用するだけです。これにより、対話型シェルが開き、コードをステップ実行し、変数を検査し、ロジックを対話的にデバッグできます。

デバッグにはprint()とロギングのどちらを使用する必要がありますか?

print()は高速ですが、Pythonのloggingモジュールを使用する方が優れています。より柔軟性があり、開発と本番環境の両方でうまく機能し、ログレベルの制御、フォーマット、ファイルまたは監視システムへの出力が可能です。

DjangoのDEBUGモードは何をしますか?

settings.pyでDEBUG = Trueの場合、Djangoはスタックトレース、変数値、および役立つデバッグコンテキストを含む詳細なエラーページを表示します。これは開発中に非常に役立ちますが、セキュリティ上の理由から本番環境では決して有効にしないでください。

Django Debug Toolbarとは何ですか?どのように役立ちますか?

Django Debug Toolbarは、Webページにパネルを追加する強力なデバッグツールです。SQLクエリ、実行時間、リクエストヘッダー、テンプレートコンテキスト、キャッシュの使用状況などを表示し、各リクエストの裏側で何が起こっているかを検査するのに役立ちます。

ブラウザを使用せずにビューまたはAPIをデバッグするにはどうすればよいですか?

Djangoの組み込みテストクライアントを使用します。

from django.test import Client
client = Client()
response = client.get('/your-url/')
print(response.content)

これにより、HTTPリクエストをシミュレートし、ターミナルで直接レスポンスを検査できます。

shell_plusとは何ですか?なぜ使用する必要がありますか?

django-extensionsパッケージのshell_plusは、すべてのモデルと設定を自動的にインポートする拡張された対話型シェルです。すべてを手動でインポートすることなく、ORMクエリをすばやくテストしたり、関数を試したりするのに最適です。

Djangoで着信リクエストとレスポンスをログに記録するにはどうすればよいですか?

リクエストとレスポンス情報をログに記録するために、カスタムミドルウェアを作成できます。たとえば:

class SimpleLogMiddleware:
    def __call__(self, request):
        print(f"Request Path: {request.path}")
        response = self.get_response(request)
        print(f"Response Status: {response.status_code}")
        return response

これにより、リクエスト全体の問題を追跡できますが、本番環境では機密情報をログに記録しないようにしてください。