11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Docker上で動くgunicorn + DjangoアプリケーションをVS Codeからリモートデバッグする

Last updated at Posted at 2019-09-10

はじめに

Pythonを使ったWeb開発を始めるにあたり、まずは快適なデバッグ環境を整えようと考えました。Web上では、Docker gunicorn+Django VSCodeのすべての要素をカバーした情報がうまく見つからなかったので、備忘録として残します。

構成の概要

python remote debugging.png

クライアント側

VS Codeに、Python extension for VS Codeをインストールして、ポート3000番経由で、サーバー側で起動しているデバッグサーバーにアクセスします。

サーバー側

ptvsd (Python Tools for Visual Studio debug server)を gunicorn から呼び出し、デバッグサーバーを立ち上げます。デバッグサーバーはポート3000番でクライアントの接続を待ち受けます。

各種バージョン

  • Mac OS 10.14.6
  • Visual Studio Code 1.37
  • Docker 19.03.2
  • Python 3.7.4
  • gunicorn 19.9.0
  • Django 1.11.8
  • ptvsd 4.3.2

デバッグの準備

1.クライアント側準備

1-1.Python extention for Visual Studio Codeのインストール

VS Codeのメニューから、該当の拡張機能をインストールします。

1-2.VS Codeにデバッグ設定を追加する

左側のメニューからデバッグアイコン(虫の形)を選択し、上部のメニューより「設定の追加」⇨「Python」⇨「Remote Attach」を選択します。

vscode-debug.png

開いたlaunch.jsonに以下のように編集します。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Remote Django Remote Debug",
            "type": "python",
            "request": "attach",
            "port": 3000,
            "host": "localhost",
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "."
                }
            ]
        },
    ]
}

2.サーバー側準備

2-1.ptvsdのインストール

ptvsd 4.3.2 を requirements.txtに加えます。昔は3.0.0に固定しないとリモートデバッグが動かないバグがあったが、最新版では解消しているようです。

2-2.Docker環境で3000番ポートを解放する

docker-compose.yml に以下の設定を加えます。

ports:
  - "3000:3000"

2-3.gunicorn から ptvsd を起動する

Django のエントリポイント(最初に呼び出される処理)に ptvsd を呼び出すコードを追記します。ここでは、ローカルホストで先ほど解放したポート番号3000番で接続を受け付けます。

import ptvsd
ptvsd.enable_attach(address=('0.0.0.0', 3000))

エントリポイントごとのファイルは以下の通りです。

  • 管理コマンドから起動する場合: manage.py
  • gunicorn から mysite:wsgi と呼び出す場合: mysite/wsgi.py

2-4.gunicornのタイムアウトを伸ばす

デバッグ中にブレークポイントで停止させていると、gunicorn がタイムアウトします。こちらに記載がある通り、以下の引数で gunicorn のプロセスのタイムアウトを変更できます。

gunicorn "mysite.wsgi" --timeout 1000000

また、環境変数として.evn.docker-composeファイルに記述すると、docker-compose.ymlの修正せずにTIMEOUTを変更できます。

GUNICORN_CMD_ARGS="--timeout=1000000"

3. デバッグ

3-1.アプリケーションの起動

docker-compose up等のコマンドで、デバッグ対象のアプリケーションを起動します。gunicorn 起動時に ptvsd が呼び出されて、ポート3000番でクライアントの接続を待ち受けます。

3-2.ブレイクポイントの設定

デバッガーで確認したいソースコードの行の左をクリックし、ブレークポイント(赤丸)を設定します。

3-3.デバッガのアタッチ

左側のメニューからデバッグアイコン(虫の形)を選択します。上部のドロップダウンメニューから「Remote Django Remote Debug」を選択し、デバッグを開始します。

3-4.アプリケーションへのアクセス

ローカル環境で起動したアプリケーションにアクセスします。うまくデバッガーに接続できていれば、ブレークポイントに到達した段階で、アプリケーションの処理が一時停止し、デバッグが可能となります。

vscode-debug3.png

快適なデバッグライフを!

参考文献

11
11
0

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
11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?