根本原因是VSCode解释器与安装Django的虚拟环境不一致,需通过“Python: Select Interpreter”选择venv路径,并在launch.json中配置--noreload及env字段确保环境变量注入。

VSCode启动Django时提示ModuleNotFoundError: No module named 'django'
根本原因不是没装Django,而是VSCode用的Python解释器跟终端里装包的那个不一致。你用pip install django装在了venv里,但VSCode默认调用了系统Python或另一个环境。
- 按
Ctrl+Shift+P(macOS是Cmd+Shift+P),输入“Python: Select Interpreter”,选中项目根目录下的venv/bin/python(Linux/macOS)或venv\Scripts\python.exe(Windows) - 确认选中后,VSCode右下角状态栏会显示该路径;再打开一个新终端(
Ctrl+Shift+`),执行which python或where python,路径应与状态栏一致 - 如果仍报错,手动在终端激活虚拟环境再启动VSCode:
source venv/bin/activate && code .(Linux/macOS)或venv\Scripts\activate.bat && code .(Windows)
在Django视图函数里打不了断点,调试直接跳过
常见于用python manage.py runserver启动后,在views.py里加断点却不起作用——这是因为Django默认启用自动重载(autoreload),它会fork子进程跑实际请求,而VSCode调试器只附着在主进程上。
- 启动命令改成:
python -m django runserver --noreload(注意不是manage.py,而是-m django) - 确保
launch.json中"module"字段设为"django",而非"manage"或留空;"args"写成["runserver", "--noreload"] - 别在
manage.py里打断点——它只运行一次,真正处理HTTP的是django.core.servers.basehttp里的线程,断点必须落在views.py、models.py等业务代码里
os.getenv('DEBUG')始终返回None,环境变量没生效
Django调试时读不到.env或launch.json里设的环境变量,通常是因为VSCode调试器没把它们传给子进程,或者Django还没加载django-environ这类库就提前读取了。
- 最稳的方式:在
launch.json的"env"字段里硬编码,比如"env": {"DEBUG": "1", "DATABASE_URL": "sqlite:///db.sqlite3"} - 如果用
python-decouple或django-environ,确保settings.py顶部已执行env = environ.Env(),且.env文件放在项目根目录(和manage.py同级) - 避免在
__init__.py或模块顶层直接调用os.getenv()——此时Django配置还没加载,环境变量可能被覆盖;改用settings.DEBUG这种延迟求值方式
调试时URL路由404,但终端里runserver能正常访问
这不是路由问题,是VSCode调试模式下Django没加载URL配置——常见于settings.py里ROOT_URLCONF路径写错,或urls.py有语法错误导致导入失败,而调试器静默吞掉了ImportError。
立即学习“Python免费学习笔记(深入)”;
- 检查
settings.py中ROOT_URLCONF = 'myproject.urls'是否指向真实存在的模块,路径要和manage.py所在位置相对 - 在调试前,先在终端运行
python manage.py show_urls(需装django-extensions)验证路由是否可识别 - 如果用
include()引入子路由,确保对应app已加入INSTALLED_APPS,否则urls.py导入时会抛AppRegistryNotReady,调试器不报错但路由表为空
环境变量和断点失效这两块最容易反复折腾,尤其当项目从命令行迁移到VSCode调试时,解释器、进程模型、环境注入这三个层面必须对齐,差一个就卡住。



















