拓冰建站拓冰建站
首页 / 资讯中心 / 正文

FastAPI 调试实战:在编辑器中连接 VS Code 与 PyCharm 调试器运行 Uvicorn 服务器

FastAPI 调试实战在编辑器中连接 VS Code 与 PyCharm 调试器运行 Uvicorn 服务器【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi本文围绕 FastAPI 官方教程中的调试Debugging主题展开教你如何在 FastAPI 应用内直接导入并启动 Uvicorn 服务器从而让 Visual Studio Code、PyCharm 等编辑器的调试器直接接管整个服务进程。读完后你将掌握if __name__ __main__守卫的工作原理、断点调试 FastAPI 路由的完整操作步骤并理解官方仓库测试是如何用 mock 精确验证导入时不启动、作为主程序运行时才启动这一行为的。一、在 FastAPI 应用中直接调用 uvicorn官方教程给出的核心做法是不通过命令行外部启动 Uvicorn而是在 FastAPI 应用文件内部导入uvicorn并直接调用uvicorn.run()。官方示例代码位于 docs_src/debugging/tutorial001_py310.py完整内容如下import uvicorn from fastapi import FastAPI app FastAPI() app.get(/) def root(): a a b b a return {hello world: b} if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)关键点拆解app FastAPI()创建应用实例后续所有路由都挂在这个实例上app.get(/)定义一个 GET 路由函数体内a a、b b a这样的简单字符串拼接正是官方故意留下的断点演示区方便你在调试器中观察局部变量if __name__ __main__:Python 主程序守卫只有当这个文件被直接执行时才进入该分支uvicorn.run(app, host0.0.0.0, port8000)以 ASGI 应用对象为参数启动 Uvicorn 服务器监听所有网络接口0.0.0.0的8000端口。因为 Uvicorn 服务器是由你的 Python 进程亲自拉起来的编辑器的调试器只需启动这一个 Python 解释器进程即可覆盖全部代码路径——这是整个调试方案成立的前提。二、深入理解__name__ __main__守卫2.1 守卫的作用if __name__ __main__:的主要目的是让某段代码只在文件被直接运行时执行而在被其他模块导入时不执行。典型场景就是上面的uvicorn.run(...)调用——你希望python myapp.py时自动起服务器但from myapp import app时只拿到app对象不产生任何副作用。2.2 直接运行文件时假设你的文件名为myapp.py当你在终端执行$ uv run python myapp.pyPython 会为该文件自动创建一个内部变量__name__其值被设置为字符串__main__。因此判断条件__name__ __main__为真下面的代码块被执行uvicorn.run(app, host0.0.0.0, port8000)服务器随即启动。2.3 被其他文件导入时如果存在另一个文件importer.py内容为from myapp import app # 这里还有更多代码那么导入myapp模块时myapp.py内部的__name__不再是__main__而是模块名myapp。于是uvicorn.run(app, host0.0.0.0, port8000)这行代码不会被执行导入方可以干净地拿到app实例用于自己的启动逻辑或测试。这也是 FastAPI 官方示例与测试体系能够导入即不启动服务的根本原因。关于__main__机制的更多细节可查阅 Python 官方文档中对__main__模块的说明。三、仓库测试如何印证导入不启动 / 主运行才启动官方仓库并非仅停留在文档描述层面而是在 tests/test_tutorial/test_debugging/test_tutorial001.py 中用unittest.mock对这一行为做了精确的双向验证test_uvicorn_run_is_not_called_on_import()先mock.patch(uvicorn.run)打桩再importlib.import_module(MOD_NAME)导入示例模块最后断言uvicorn_run_mock.assert_not_called()——证明导入模块时uvicorn.run绝不会被调用与上文 2.3 节的结论完全一致test_uvicorn_run_called_when_run_as_main()同样打桩后通过runpy.run_module(MOD_NAME, run_name__main__)模拟以主程序身份运行然后断言uvicorn_run_mock.assert_called_once_with(mock.ANY, host0.0.0.0, port8000)——证明以__main__方式运行时uvicorn.run恰好被调用一次且host、port参数与示例代码一致。此外test_get_root()用TestClient验证路由返回{hello world: ba}test_openapi_schema()校验生成的 OpenAPI 3.1.0 文档结构说明示例文件同时具备可导入、可测试、可独立运行三重属性。从测试结构看官方正是依赖__name__守卫才做到了同一个文件既能被测试框架安全导入又能被开发者一键直接运行。四、用调试器直接运行你的 FastAPI 代码由于 Uvicorn 服务器直接在你的代码内启动你可以让 Python 调试器直接拉起整个程序你的 FastAPI 应用从而在断点处暂停、检查变量、单步执行——无需再处理命令行启动的服务进程无法附加断点的经典难题。4.1 Visual Studio Code 操作步骤打开 Debug调试面板点击 Add configuration...添加配置选择 Python使用 Python: Current File (Integrated Terminal)当前文件集成终端选项运行调试器。启动后服务器将带着你的 FastAPI 代码运行会在你设置的断点处暂停你也可以在集成终端中查看 Uvicorn 的输出。效果大致如下4.2 PyCharm 操作步骤打开 Run运行菜单选择 Debug...调试选项弹出上下文菜单选择要调试的文件本例中为main.py。随后服务器同样会带着你的 FastAPI 代码启动并在断点处暂停。效果大致如下五、小结与适用前提方案要点把uvicorn.run(app, host0.0.0.0, port8000)放进if __name__ __main__:守卫中即可用任意编辑器调试器VS Code、PyCharm 等直接调试 FastAPI 应用参考实现见 docs_src/debugging/tutorial001_py310.py__name__守卫的价值直接运行时值为__main__并启动服务器被import时值不等于__main__不会启动服务器保证模块可被安全导入测试框架、WSGI/ASGI 启动器等场景均依赖此特性仓库测试 tests/test_tutorial/test_debugging/test_tutorial001.py 对两种行为都做了 mock 级断言适用前提与限制这种代码内启动 Uvicorn的方式主要面向开发与调试阶段便于断点调试和快速验证它监听0.0.0.0:8000属于开发配置生产部署场景通常改由进程管理器或容器入口以命令行方式启动 Uvicorn 并配合--workers、--reload等参数具体取舍请依据部署环境决定。【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门