无法从vs代码调试Django进程

时间:2018-02-04 19:09:41

标签: python django python-3.x debugging visual-studio-code

我试图从vs代码调试我的Django进程。但我无法让它发挥作用。在我的 manage.py

import ptvsd
try:
    ptvsd.enable_attach("my_secret", address=('localhost', 3000))
except:
    pass

在我的 docker-compose

version: '3'

services:
  db:
    image: postgres
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
      - "3000:3000"
    depends_on:
      - db

我的调试信息在 launch.json

{
  "name": "Attach (Remote Debug)",
  "type": "python",
  "request": "attach",
  "localRoot": "${workspaceFolder}",
  "remoteRoot": "/code",
  "port": 3000,
  "secret": "my_secret",
  "host": "localhost"
},

Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
EXPOSE 3000

启动调试会话时,我收到一条消息:“调试适配器进程意外终止”。有没有人有任何关于如何使这个工作的提示?我在我的计算机和docker容器中运行ptvsd 3.0.0。

3 个答案:

答案 0 :(得分:2)

使用VSCode检查在Docker环境中调试Django有三点:

  • VSCode远程调试目前仅适用于ptvsd==3.0.0(参见VSCode documentation

  • 使用docker-compose,需要将ptvsd附加到默认路由0.0.0.0,以便从主机(如Django开发服务器)访问

  • ptvsd依赖套接字(只能连接一次到端口),Django开发服务器会在项目中每个代码更改后重新加载manage.py文件。因此,在每次代码修改后,调试服务器将无法附加。要解决此问题,最佳解决方案是将ptvsd调试器附加到wsgi.py文件中,该文件仅加载一次。

答案 1 :(得分:1)

为了在VS Code中为Django应用启用远程调试(例如,在调试Docker容器时),请执行以下操作:

  1. ptvsd添加到您的requirements.txt文件

    ptvsd == 4.3.2

  1. 在您的launch.json中添加以下内容:

    {
          "name": "Remote Django App",
          "type": "python",
          "request": "attach",
          "pathMappings": [
              {
                  "localRoot": "${workspaceFolder}",
                  "remoteRoot": "/remote_root/of/your/app"
              }
          ],
          "port": 3000,
          "host": "localhost"
      }

(编辑remoteRoot选项以反映您的应用)。

  1. 在您的manage.py中添加以下内容:

    if __name__ == "__main__":                                                    # This already exists
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project.settings")  # This already exists

        from django.core.management import execute_from_command_line              # This already exists
        from django.conf import settings

        if settings.DEBUG:
            if os.environ.get('RUN_MAIN') or os.environ.get('WERKZEUG_RUN_MAIN'):
                import ptvsd
                ptvsd.enable_attach(address = ('0.0.0.0', 3000))
                print "Attached remote debugger"

        execute_from_command_line(sys.argv)                                       # This already exists

注意:此处的第三条if语句确保调试器在实时重新加载后不会再次连接。

  1. 请确保在您的docker命令或docker-compose.yml

  2. 中打开端口3000
  3. 运行您的应用程序:


    python manage.py runserver 0.0.0.0:8000

逐行调试

注意:在某些(非Django)情况下,除非远程服务器在Linux上运行,否则除非您在remoteRoot参数(Viscual Studio Code)中使用双反斜杠(\),否则逐行调试将不起作用。例如。 "remoteRoot": "\\remote_root\\of\\your\\app"

来源

Source 1
Source 2

答案 2 :(得分:0)

您的问题可能是网络服务器正在重新加载您的文件并终止您的连接。将print或log statemet放在settings.py代码的开头,看看它是否被加载了两次。然后使用no-reload标志运行它。只要在主机和远程计算机上安装了ptvsd == 3.0.0就可以正常工作。