flask调试断点失效的根本原因是werkzeug重载机制fork子进程而vscode默认只附加主进程;须通过launch.json以"module": "flask"模式启动,禁用--reload或启用"subprocess": true,并确保环境变量、路径及工厂函数调用配置正确。

Flask应用启动后VSCode不进断点
根本原因是默认用 python app.py 启动,绕过了VSCode调试器的控制。Flask的 debug=True 会触发 Werkzeug 的重载机制,它会 fork 子进程,而VSCode默认只附加到主进程,断点自然失效。
- 必须通过VSCode的
launch.json启动,不能手动终端运行 - 确保
"module": "flask"模式,而不是"file"模式——后者容易漏掉重载子进程 -
"env": {"FLASK_APP": "app.py", "FLASK_ENV": "development"}要显式声明,别依赖命令行环境变量 - 如果用工厂函数(
create_app()),得配"args": ["--app", "app:create_app", "--debug"]
launch.json里该选“Python: Flask”还是手动写配置
VSCode官方Python插件的 Python: Flask 预设模板看似省事,但实际埋了坑:它硬编码了 FLASK_APP=app.py,且不支持带参数的工厂函数调用,一改文件名或结构就报 No module named 'app'。
- 删掉自动生成的
Python: Flask配置,手写更可控 - 核心字段是:
"module": "flask"、"args": ["--app", "myapp:create_app", "run", "--debug", "--no-reload"](关掉自动重载,避免多进程干扰调试) - 加
"justMyCode": false才能进Werkzeug源码断点(比如想查请求怎么被分发的) - 路径相关字段如
"cwd"必须设为项目根目录,否则import会失败
修改代码后断点消失或跳过
这是Werkzeug重载(reloader)在作怪。它检测到文件变化,杀掉旧进程、拉起新进程,但VSCode没跟上这个切换,断点还挂在已销毁的进程上。
- 最稳方案:启动时加
--no-reload参数,调试阶段手动Ctrl+C再重启 - 若非要热重载,得在
launch.json加"subProcess": true,让VSCode尝试附加子进程(但成功率不稳定,尤其Windows) - 确认
app.run()没被写死在代码里——调试时这行必须删掉,否则和launch.json冲突 - 检查文件保存编码是否为UTF-8无BOM,BOM会导致
ImportError,进而让重载失败静默退出
调试API接口时看不到request内容
常见于用Postman或curl调接口,VSCode断点进了,但 request.json 是 None、request.form 空、甚至 request 对象直接报错 Working outside of application context。
- 确保断点打在路由函数内部,而不是模块顶层——顶层没请求上下文
- 检查请求头:
Content-Type: application/json缺失会导致request.json为None - 表单数据要用
Content-Type: application/x-www-form-urlencoded,别误设成json - 如果用工厂函数,确认
@app.route注册在create_app()返回的app实例上,而非全局app
--no-reload 和 subProcess 这两个开关,比调一百遍 launch.json 都管用。











