在dev contain中调试Python-Django的VS代码

2024-04-18 02:59:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在一个停靠的容器中开发一个pythondjango应用程序。我已经成功地将远程调试设置为连接到容器内的Django服务器。Me配置如下。你知道吗

启动.json

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

管理.py

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'llf_api.settings')
    try:
        from django.core.management import execute_from_command_line
        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', 8001))
              print("Attached remote debugger")

    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

码头工人-合成.yml

services:
  api:
    image: ${DOCKER_IMAGE_BASE}:${DOCKER_TAG}
    build:
      context: .
      dockerfile: ./Dockerfile.development
    env_file:
      - .env
    environment:
      - DATABASE_URL=postgres://username:password@db/db_name
    volumes:
      - .:/app
    command: >
      bash -c "wait-for-it --service db:5432
      && python3 manage.py runserver 0.0.0.0:8000"
    ports:
      - "9000:8000"
      - "9001:8001"
    depends_on:
      - db
    tty: true
    stdin_open: true

问题是我在dev container(上面的Dockerfile.development)中运行VS代码。因此VS代码基本上是在Django服务器正在运行的同一个容器中运行的,这会使我认为需要通过将我的launch.json设置为以下值来连接到ptvsd正在运行的本地端口(8001):

启动.json

{
  "name": "Local Django App",
  "type": "python",
  "request": "attach",
  "host": "api",
  "port": 8001
}

但是这不起作用。当我尝试在VS代码中附加调试器时,它似乎最终会超时。有人知道这是怎么做到的吗?你知道吗


Tags: djangonamefromimportenvapijsondb
1条回答
网友
1楼 · 发布于 2024-04-18 02:59:27

我对VS代码和服务器运行方式的理解是错误的。服务器和VS代码使用的是同一个映像,但不是同一个容器。容器并排运行,因此本地网络对两者都不可用。你知道吗

为了实现这一点,我意识到我需要vscode容器通过在主机上打开的调试端口访问服务器的容器。我知道的唯一方法是使用docker.for.mac.localhost作为主机。因此,所有需要从我的原始设置更改的就是launch.json配置。你知道吗

启动.json

{
  "name": "Remote Django App",
  "type": "python",
  "request": "attach",
  "pathMappings": [
    {
      "localRoot": "${workspaceFolder}",
      "remoteRoot": "/app"
    }
  ],
  "port": 9001,
  "host": "docker.for.mac.localhost"
}

VS代码现在连接到端口9001,该端口已在主机上公开,并使用docker.for.mac.localhost连接到主机。真管用!你知道吗

相关问题 更多 >