如何在VSCode中以调试模式自动重新加载运行FastAPI项目

17

使用 FastAPI Python 开始。

以下是我构建服务器的方式。

class Server:
    def __init__(self):
        self.app = FastAPI()

    def runServer(self, host: str, port: int,is_dev:bool):
        uvicorn.run(self.app, host=host, port=port,debug=is_dev)


if __name__ == "__main__":
    server = Server()
    # read the environment variables
    host: str = os.environ['host']
    port: int = int(os.environ['port'])
    is_dev: bool = bool(os.environ['dev'])

    server.runServer(host, port, is_dev)

这将启动服务器,但如果我进行任何更改,则不会运行自动重新加载模式。

即使我尝试过

uvicorn.run(self.app, host=host, port=port, reload=is_dev)

重新加载(reload)可能不是一个选项,这导致服务器崩溃。

我尝试在launch.json中传递--reload参数,但仍然无法工作。

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: FastAPI",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}/main.py",
            "jinja": true,
            "args": ["--reload"],
            "env": {
                "host": "127.0.0.1",
                "port": "5555",
                "dev": "true"
            }
        }
    ]
}

有什么想法吗?我有什么遗漏的吗?

2个回答

41

uvicorn 只有在 app 参数以 <module>:<app_instance> 的格式为字符串,且 reloaddebug 参数为真时,才会以重新加载的模式启动。如下所示:

if __name__ == "__main__":
    uvicorn.run("example:app", host="127.0.0.1", port=5000, reload=True)

摘自文档:

请注意,应用程序实例本身可以传递,而不是使用应用程序导入字符串。

uvicorn.run(app, host="127.0.0.1", port=5000, log_level="info")

然而,如果您正在使用多进程(workers=NUM)或重新加载(reload=True),则此样式仅适用于某些情况,因此我们建议使用导入字符串样式。


所以,我需要传递字符串而不是应用程序对象,然后只有在reload=True的情况下才能工作? - Sunil Garg
是的,为了重新加载,您应该使用字符串应用程序参数。 - alex_noname
如果我需要将标题和描述传递给应用程序以获取文档,该怎么办? - Sunil Garg
4
如果你和我一样对 example:app 感到困惑:我假设(因为这个理论对我有效)example 是你正在运行 FastAPI 应用程序的文件名,因此在这种情况下是 example.py,而 app 来自于 app = FastAPI(debug=True) - DangerPaws
@alex_noname:您能否澄清一下将应用程序作为字符串传递和将其作为fastAPI对象传递之间的区别?我们应该如何命名字符串?是否有相关文档? - kotchwane
当我这样做时,为什么 VS Code 没有显示任何变量? - j7skov

0
如果你的文件名为handler.py,那么字符串应该是"handler:app"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接