Djangoのデバッグを簡単にする、オレオレVSCode活用法

こんにちは。22年度新卒でバックエンドエンジニアとして入社しました@mobojisanと申します。可愛い系イケメンの攻め顔や照れからしか得られない栄養を摂取するため、推し活に励む日々を送っております。

前回、VSCodeでのDjangoデバッグ環境のセットアップについて書きました。今回は具体的にデバッグの際にVSCodeをどう使っているかについて触れていきます。

 

xmart-techblog.hatenablog.com

 

なぜデバッガが必要か

最初からこんなことを言うのもなんですが、Djangoは学習コストが高いですよね。チュートリアルだと関数ベースビューから入り、理解したと思ったのもつかの間いきなりクラスベースビューの話に移ります。インターネット上で拾える記事はほぼクラスベースビューのため、関数ベースビューの話はどこいったの!?と疑問を抱きながらやることになるのは必至です。さらに、Djangoは明示的に変数を渡さない部分が多く、初学者ともなれば全容を把握するのがなおさら困難です。

デバッガを使うとこうした「隠れた」変数を動的に確認することができます。デバッガを活用して変数がどう渡っているかを確認してみます。

 

VSCodeであらゆるクラス変数や特殊メソッドの状態を確認

前回、以下画像のようにDjangoデバッグに必要なlaunch.jsonの構成からデバッガ起動を行いました。具体的な使用方法を見てみましょう。

構成と起動

Djangoデバッグに必要なlaunch.jsonを構成

構成ができれば、起動は非常に簡単です。左のタブから虫のついたアイコンを選び、緑色の再生ボタンを押すだけ。

デフォルトの構成設定ですと./manage.py runserverが起動し、ターミナルでDjangoを通常起動した際と同じ動きをしますが。しかし、ブレークポイント(赤丸)を入れることでデバッガの真価を発揮します。

10行目のように、見たい変数が含まれている行の左の空白をクリックするとブレークポイントを挿入でき、デバッガを起動した際に実行がそこで止まるようになります。

デバッガの画面

api/v1/が叩かれた時に初めてブレークポイントで実行が停止し変数の読み込みが確認できる

このとき、注意点が2つあります。

viewやmodelにブレークポイントを置いた際、サーバーが起動する前の__init__.pyの初回読み込みが行われる場合があり、以下の画像での右上ホバーの青色再生ボタンをサーバーが起動するまで何度かクリックする必要があります。

また、サーバー起動後にすぐブレークポイントまで辿り着いて止まるのではなく、ブラウザ上で画面操作をして該当するエンドポイントが叩かれた時にアクティブウィンドウがVSCodeに持っていかれ、ブレークポイントが起動して変数の情報が表示されます。

画面を初めて見たとき、あまりの表示項目の多さに圧倒されます。しかし実際に必要とする情報はごく一部に過ぎません。あらゆる変数が表示されるのでは冗長で見づらいですし、Special Functionなどは定義を確認するのには役立ちますがデバッグの際の出番はあまりない所感です。そこで以下のようにして必要な部分にスコープを当てた表示が可能です。

ウォッチ式で変数に何が渡っているかを分かりやすく把握しよう

デバッグコンソールに「ウォッチ式」というのがあり、こちらを使用することで特定の項目の値の変化を追うことが可能になります。

例えば、以下の画面で21行目に定義したquerysetですが、「+」ボタンを押してウォッチ式に追加しておくと、流動的で表示項目が逐一変わる変数タブとは異なり常に表示されているので値の変化を目に見て分かりやすい状態で置いておけます。(有効な時)

querysetをウォッチ

ウォッチ「式」とあるように、基本的にはPythonの式なら評価できます。

自分の使い方では、例えばどのシリアライザーが叩かれているのかをきちんと確認したい際、self.requestをウォッチ式に入れることでどのHTTPメソッドが叩かれているかを見てそこからシリアライザーの特定につなげています。

今回個人的な使い方を紹介しましたが、まだまだ機能をフルに使いこなせてないためアップデートの余地があると思っております。ウォッチすると便利な式やクラス変数などが頭に浮かんだり、こんな使い方があるのに使ってないの?と思われたりした方、ぜひコメントをいただけますと筆者としても喜ばしいです。

あとがき

ここまでお読みくださいましてありがとうございました。VSCodeDjangoデバッグする方法のイメージがついていれば幸いです!

クロスマートでは現在エンジニア採用を強化しており、フロントエンド・バックエンドなどの職種でエンジニアを募集しております。

ご興味を持たれた方は以下のリンクから「話を聞きに行きたい」を押していただいて、弊社代表の顔だけでも覚えて帰っていただければ!

www.wantedly.com