三周精通FastAPI:33 在编辑器中调试
官方文档:https://fastapi.tiangolo.com/zh/tutorial/debugging/
调试¶
你可以在编辑器中连接调试器,例如使用 Visual Studio Code 或 PyCharm。
调用 uvicorn
¶
在你的 FastAPI 应用中直接导入 uvicorn
并运行:
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 myapp.py
而当其它文件导入它时并不会被调用,像这样:
from myapp import app
更多细节¶
假设你的文件命名为 myapp.py
。如果你这样运行:
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__
。所以,下面这一行不会被执行:
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安装:
pkg install vscode
启动vscode,创建文件myqpp.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, host="0.0.0.0", port=8000)
设置调试器
安装CodeLLDB,说不支持FreeBSD
安装调试器:Python Debugger (PyDev)
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"}
证明程序继续执行了。
调试实践完毕!