delhi09の勉強日記

技術トピック専用のブログです。自分用のメモ書きの投稿が多いです。あくまで「勉強日記」なので記事の内容は鵜呑みにしないでください。

DjangoアプリをVS Codeでデバッグ実行する (2020/5/6時点)

DjangoアプリをVS Code上でデバッグ実行したのでメモ

以下の公式ドキュメントを参照して進めていく。
code.visualstudio.com

デバッグ対象のアプリには公式のDjangoチュートリアル を自分でやってみた際のコードを使用する。
https://github.com/kamatimaru/django-tutorial

前提

※ Dockerコンテナ上でのデバッグ実行は別記事にする。

手順

1.プロジェクトのrootディレクトリ直下でVS Codeを開く。

$ cd /path/to/project_root_dir
$ code .

2.アクティビティバーのデバッグビューを押す。

f:id:kamatimaru:20200506180432p:plain

3.「launch.json ファイルを作成します」を押す。

4. Pythonフレームワークの選択肢が出てくるので、「Django」を選択する。

f:id:kamatimaru:20200506180922p:plain

5. manage.pyのパスを入力する。

次にDjnagoのmanage.pyのパスを入力するように求められる。

デフォルトでは「${workspaceFolder}/manage.py」となっている。
Djangoチュートリアルに沿って実装した場合、manage.pyの場所は「${workspaceFolder}/mysite/manage.py」となっているはずなので、デフォルト値を修正する。
f:id:kamatimaru:20200506181736p:plain

returnを押す。

6.プロジェクトのrootディレクトリ直下に以下の.vscode/launch.jsonが作成されていることを確認する。

$ ls .vscode/
launch.json
$ cat .vscode/launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Django",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}/mysite/manage.py",
            "args": [
                "runserver",
                "--noreload"
            ],
            "django": true
        }
    ]
}

7.launch.jsonを編集する。

「--nothreading」を追加する。

[変更前]

"args": [
                "runserver",
                "--noreload"
            ],

[変更後]

"args": [
                "runserver",
                "--noreload",
                "--nothreading"
            ],

※オプションについて

  • --noreload

何故デフォルトで「--noreload」が設定されているのか分からなかった(むしろ開発時にはオートリロードされないのは不便では?と思ってしまった)が、オートリロードを有効にしているとpythonプロセスが2つ起動することが分かった。プロセスが複数存在するとデバッガが追跡する際に不都合があるため、オートリロードはOFFに設定するのかな?と理解している。

  • --nothreading

VS Codeの公式ドキュメントの「Debug Python within a container」を読むと、「--nothreading」も設定している。
code.visualstudio.com

Djangoの開発用サーバーはデフォルトではマルチスレッドが有効になっているとのことなので、基本的には上記と同じ理由でOFFにするものと理解している。

--nothreading
Disables use of threading in the development server. The server is multithreaded by default.

docs.djangoproject.com

8.デバッグを開始する。

赤丸の矢印を押す。
f:id:kamatimaru:20200506182939p:plain

ターミナルに以下のようにメッセージが表示されれば起動成功
f:id:kamatimaru:20200506183226p:plain

ブラウザでもアクセスしてみて正常に閲覧できることを確認する。
f:id:kamatimaru:20200506183331p:plain

9.ブレークポイントを貼ってデバッグする。

例えば以下のようにブレークポイントを貼る
f:id:kamatimaru:20200506183539p:plain

ブラウザをリロードすると、以下のようにブレークポイントを貼った箇所で実行がストップされ、変数のダンプ情報をみることができる。
f:id:kamatimaru:20200506183827p:plain

10.サーバーを停止する。

赤丸のボタンを押す。
f:id:kamatimaru:20200506184532p:plain