我试图从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。
答案 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容器时),请执行以下操作:
ptvsd
添加到您的requirements.txt文件
ptvsd == 4.3.2
launch.json
中添加以下内容:
{
"name": "Remote Django App",
"type": "python",
"request": "attach",
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "/remote_root/of/your/app"
}
],
"port": 3000,
"host": "localhost"
}
(编辑remoteRoot
选项以反映您的应用)。
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
语句确保调试器在实时重新加载后不会再次连接。
请确保在您的docker
命令或docker-compose.yml
运行您的应用程序:
python manage.py runserver 0.0.0.0:8000
注意:在某些(非Django)情况下,除非远程服务器在Linux上运行,否则除非您在remoteRoot参数(Viscual Studio Code)中使用双反斜杠(\),否则逐行调试将不起作用。例如。 "remoteRoot": "\\remote_root\\of\\your\\app"
答案 2 :(得分:0)
您的问题可能是网络服务器正在重新加载您的文件并终止您的连接。将print或log statemet放在settings.py代码的开头,看看它是否被加载了两次。然后使用no-reload标志运行它。只要在主机和远程计算机上安装了ptvsd == 3.0.0就可以正常工作。