断点不命中主因是launch.json配置错误或解释器未选对;django调试必须设"type":"python"、"module":"django"、"args":["runserver","--noreload"],并配"subprocess":true和正确pythonpath。

断点不命中?不是代码问题,90% 是 launch.json 配错或解释器没选对。
launch.json 里这三项写错,Django 断点永远不亮
Django 调试必须走 django 模块启动,而不是直接跑 manage.py。VSCode 不会自动识别 Django 入口,全靠 launch.json 显式声明。
-
"type": "python"—— 必须是这个值,不能是"pwa-python"或空着;否则调试器根本不会加载 -
"module": "django"—— 这是关键,告诉 VSCode 启动的是 Django 命令行入口,不是普通脚本 -
"args": ["runserver", "--noreload"]——--noreload必须加,Django 的 auto-reloader 会 fork 子进程,VSCode 默认只 attach 主进程,断点进不去视图函数 -
"env": {"PYTHONPATH": "${workspaceFolder}"}—— 补路径防ModuleNotFoundError,尤其当settings.py不在项目根目录时
Flask 调试卡在启动阶段?试试 subProcess 和 justMyCode
Flask 开发模式默认启用 reloader,和 Django 类似,也会 fork 子进程。但 Flask 启动方式更灵活(app.run()、flask run、gunicorn 等),调试配置稍有不同。
- 用
"program": "${file}"时,确保当前打开的是 Flask 入口文件(如app.py),且里面调用了app.run(debug=True) - 如果用
flask run命令启动,应改用"module": "flask"+"args": ["run", "--no-reload"] - 加
"subProcess": true—— 让调试器跟踪子进程,否则断点只在启动阶段生效,进不了路由函数 - 加
"justMyCode": false—— Flask 内部启动逻辑在第三方包里,设为true会跳过这些帧,导致断点“消失”
解释器选错,所有断点都白设
VSCode 不继承终端的虚拟环境状态,它只认 python.defaultInterpreterPath 指向的解释器。哪怕你在终端里 source venv/bin/activate 后能跑通,VSCode 调试仍可能报 ModuleNotFoundError。
- 按
Ctrl+Shift+P输入Python: Select Interpreter,选中你项目对应的venv/bin/python(macOS/Linux)或venv\Scripts\python.exe(Windows) - 确认左下角状态栏显示的是该解释器路径,不是系统全局 Python
- Poetry 或 Conda 项目同理:必须选中它们生成的解释器,比如
~/.cache/pypoetry/virtualenvs/myproject-py3.11/bin/python - 检查
.vscode/settings.json是否已写入"python.defaultInterpreterPath",别依赖记忆或旧配置
断点显示空心圆?先看这三件事
空心红点 = VSCode 认为这行无法设断点,常见于语法错误、未加载调试配置、或运行方式不对。
- 检查
launch.json是否存在且 JSON 语法合法(VSCode 会标红) - 确认你按的是
F5(启动调试),不是Ctrl+F5(重启)或右键“Run Python File” - 在代码里临时加一行
import pdb; pdb.set_trace(),如果执行后进了 pdb,说明调试通道通了,问题出在断点注册环节 - 如果用 gevent 或其他异步库,需额外设
"env": {"GEVENT_MONKEYPATCH": "true"}并启用"subProcess": true,否则协程调度会让断点失效
复杂点在于:Django/Flask 的 reload 机制、子进程模型、以及 VSCode 调试器的 attach 策略是叠加作用的。一个参数没对齐,断点就进不了业务逻辑——这不是玄学,是调试器行为可预期的边界。











