【问题标题】:Unable to debug Django process from vs code无法从 vs 代码调试 Django 进程
【发布时间】:2018-07-14 16:24:00
【问题描述】:

我正在尝试从 vs 代码调试我的 Django 进程。但我无法让它工作。在我的 ma​​nage.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。

【问题讨论】:

  • 3000端口是否被docker镜像暴露了?
  • 是的,我也添加了我的 Dockerfile。
  • 我在使用从这里的 vscode 文档中获取的最基本配置时遇到了同样的错误 - donjayamanne.github.io/pythonVSCodeDocs/docs/…。这实际上可能是一个 vscode 错误,也许值得打开一个问题。

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


【解决方案1】:

使用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 文件中。

【讨论】:

  • “我在我的电脑和 docker 容器中都运行 ptvsd 3.0.0。”
  • 我回家后会尝试设置 wsgi.py,谢谢您的提示!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    为了在 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 中打开端口3000

    2. 运行您的应用:

    
        python manage.py runserver 0.0.0.0:8000
    
    

    逐行调试

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

    来源

    Source 1
    Source 2

    【讨论】:

      猜你喜欢
      • 2019-05-14
      • 2023-02-04
      • 2021-10-31
      • 2012-12-20
      • 2013-12-02
      • 1970-01-01
      • 2021-12-09
      • 2018-11-19
      • 2018-11-20
      相关资源
      最近更新 更多