VSCode调试FastAPI必须用"module": "uvicorn"模式,选对虚拟环境解释器,配置launch.json含--reload,安装fastapi[all],设"justMyCode": false和"subProcess": true,避免async首行断点失效。

VSCode 调试 FastAPI 异步接口失败,90% 不是代码问题,而是调试器根本没进 uvicorn 的 ASGI 生命周期——async 函数断点不触发、Depends 注入失效、中间件不执行,全因用错了启动方式。
launch.json 必须用 module: "uvicorn",不能写 program
FastAPI 是 ASGI 应用,依赖 uvicorn 管理事件循环和异步上下文。program: "main.py" 会绕过 uvicorn.run(),直接执行脚本,导致 async/await 栈帧丢失。
-
module: "uvicorn" 才能让调试器真正进入 ASGI 生命周期,断点才能停在async def函数体内部 -
args第一项必须是模块路径加实例名,例如["main:app", "--host", "127.0.0.1", "--port", "8000"];漏掉main:app就等于没指定入口 - 别手误写成
"program": "main.py"或"module": "main"——前者跳过 uvicorn,后者根本找不到模块
Python 解释器必须指向项目虚拟环境,且已装 fastapi[all]
VSCode 默认可能用系统 Python 或全局 pip 安装的包,导致 uvicorn 找不到、python-multipart 缺失、表单上传或 JWT 验证直接报错。
- 按
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(macOS),输入Python: Select Interpreter - 从列表中选带
.venv、venv或自定义名(如myenv)的路径;没有就选Enter interpreter path,填:
– Windows:.venv\Scripts\python.exe
– macOS/Linux:.venv/bin/python - 装依赖时必须用
pip install "fastapi[all]",不是pip install fastapi uvicorn——前者自动带python-multipart、python-jose、passlib和uvicorn[standard](含uvloop)
justMyCode 设为 false 才能调试依赖注入和中间件
默认 justMyCode: true 会让 debugpy 跳过所有第三方代码,结果就是断点只停在路由函数第一行,进不去 Depends 函数、看不到 Request 对象怎么构造、也查不到中间件里 request.headers 实际值。
- 在
launch.json配置中显式加上"justMyCode": false - 副作用是偶尔停在 uvicorn 底层 event loop,按
F5继续即可,不影响主线跟踪 - 如果想保持断点在重载后仍有效,还需加
"subProcess": true(尤其搭配--reload时)
--reload 必须写进 args,且位置要紧跟 main:app
调试时一边跑 VSCode,一边又在终端手动敲 uvicorn main:app --reload,两个进程抢端口,后者失败,前者因没配 --reload 根本不响应文件变更。
-
args必须包含"--reload",且顺序是["main:app", "--reload", "--host", "127.0.0.1", "--port", "8000"] - Linux/WSL 下若报
WatchFiles not available,补装watchfiles:pip install watchfiles - 避免在
async def第一行打断点——某些 Python 3.9/3.10 + debugpy 组合下首行断点静默失效;移到第二行或函数体内逻辑处更稳
最易被忽略的是:justMyCode: false 和 subProcess: true 这两个开关,不设它们,你永远只能看到“断点设上了但没停”,却查不到 Depends 里到底哪一步出错、中间件是否真生效了。


















