三周精通FastAPI:33 在编辑器中调试

官方文档:https://fastapi.tiangolo.com/zh/tutorial/debugging/

调试

你可以在编辑器中连接调试器,例如使用 Visual Studio Code 或 PyCharm。

调用 uvicorn

在你的 FastAPI 应用中直接导入 uvicorn 并运行:

python 复制代码
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, host="0.0.0.0", port=8000)

关于 __name__ == "__main__"

__name__ == "__main__" 的主要目的是使用以下代码调用文件时执行一些代码:

python 复制代码
python myapp.py

而当其它文件导入它时并不会被调用,像这样:

python 复制代码
from myapp import app
更多细节

假设你的文件命名为 myapp.py。如果你这样运行:

python 复制代码
python myapp.py

那么文件中由 Python 自动创建的内部变量 __name__,会将字符串 "__main__" 作为值。

所以,下面这部分代码才会运行:

复制代码
uvicorn.run(app, host="0.0.0.0", port=8000) 

如果你是导入这个模块(文件)就不会这样。

因此,如果你的另一个文件 importer.py 像这样:

复制代码
from myapp import app 
# Some more code 

在这种情况下,myapp.py 内部的自动变量不会有值为 "__main__" 的变量 __name__。所以,下面这一行不会被执行:

python 复制代码
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

Info

更多信息请检查 Python 官方文档.

使用你的调试器运行代码

由于是从代码直接运行的 Uvicorn 服务器,所以你可以从调试器直接调用 Python 程序(你的 FastAPI 应用)。


例如,你可以在 Visual Studio Code 中:

  • 进入到「调试」面板。
  • 「添加配置...」。
  • 选中「Python」
  • 运行「Python:当前文件(集成终端)」选项的调试器。

然后它会使用你的 FastAPI 代码开启服务器,停在断点处,等等。

看起来可能是这样:


如果使用 Pycharm,你可以:

  • 打开「运行」菜单。
  • 选中「调试...」。
  • 然后出现一个上下文菜单。
  • 选择要调试的文件(本例中的 main.py)。

然后它会使用你的 FastAPI 代码开启服务器,停在断点处,等等。

看起来可能是这样:

实践

在FreeBSD下调试(失败)

从头开始实践操作,首先启动VSCode,比如FreeBSD安装:

python 复制代码
pkg install vscode

启动vscode,创建文件myqpp.py:

python 复制代码
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, host="0.0.0.0", port=8000)

设置调试器

安装CodeLLDB,说不支持FreeBSD

安装调试器:Python Debugger (PyDev)

python 复制代码
pip install pydev

点击左边的"运行和调试"

调试失败,报错:

Error. Unable to launch pydevd: expected: python to exist (bad python.pydev.pythonExecutable (from settings)).

可能是FreeBSD下的问题。

在MAC下调试

在b = "b" + a 打断点,执行调试

在"调试控制台"显示:

INFO: Started server process [66934]

INFO: Waiting for application startup.

INFO: Application startup complete.

INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

这时候用web浏览器,浏览http://127.0.0.1:8000

发现焦点跳回到VSCode 断点处,且断点红点用黄箭头包围,证明执行到断点:

这时候按f10继续执行,

发现浏览器这时候输出了期待的信息

复制代码
{"hello world":"ba"}

证明程序继续执行了。

调试实践完毕!

相关推荐
Salt_07281 小时前
DAY 19 数组的常见操作和形状
人工智能·python·机器学习
无心水2 小时前
【Python实战进阶】2、Jupyter Notebook终极指南:为什么说不会Jupyter就等于不会Python?
python·jupyter·信息可视化·binder·google colab·python实战进阶·python工程化实战进阶
dntktop2 小时前
搜索+计算+插件…这个“全能管家”让你告别80%的桌面图标
运维·windows·自动化·编辑器
上班日常摸鱼3 小时前
Shell脚本基础教程:变量、条件判断、循环、函数实战(附案例)
python
无心水3 小时前
【Python实战进阶】5、Python字符串终极指南:从基础到高性能处理的完整秘籍
开发语言·网络·python·字符串·unicode·python实战进阶·python工业化实战进阶
2301_807583233 小时前
了解python,并编写第一个程序,常见的bug
linux·python
小白学大数据3 小时前
构建混合爬虫:何时使用Requests,何时切换至Selenium处理请求头?
爬虫·python·selenium·测试工具
2401_827560203 小时前
【Python脚本系列】PyAudio+librosa+dtw库录制、识别音频并实现点击(四)
python·语音识别
BBB努力学习程序设计3 小时前
Python自动化脚本:告别重复劳动
python·pycharm
BBB努力学习程序设计4 小时前
Python函数式编程:优雅的代码艺术
python·pycharm