如何在自定义类中用module:app模式启动带reload的FastAPI?
FastAPI类中使用reload=True的正确app路径格式
当你在类内部初始化FastAPI实例,想使用reload=True启动Uvicorn时,直接用"main:self.app"是行不通的——因为self是类实例方法内的局部引用,Uvicorn在重载模块时找不到这个符号。
要解决这个问题,你需要让FastAPI实例成为模块级可访问的对象,下面是两种可行方案:
方案一:模块级实例变量
把类的实例赋值给模块级变量,然后通过模块名:实例变量.app的格式引用:
修改后的main.py代码:
from fastapi import FastAPI import uvicorn class ApiServer: def __init__(self): self.app = FastAPI() @self.app.get("/") async def read_root(): return {"Hello": "World"} def run(self): # 引用模块级变量server的app属性 uvicorn.run("main:server.app", host="0.0.0.0", port=8000, reload=True, use_colors=False) # 在模块顶层创建实例,确保重载时Uvicorn能找到 server = ApiServer() if __name__ == "__main__": server.run()
方案二:类属性存储FastAPI实例
把FastAPI实例定义为类的属性,而非实例属性,然后通过模块名:类名.app的格式引用:
修改后的main.py代码:
from fastapi import FastAPI import uvicorn class ApiServer: # 把app设为类属性,模块级可访问 app = FastAPI() def __init__(self): @self.app.get("/") async def read_root(): return {"Hello": "World"} def run(self): # 引用类属性app uvicorn.run("main:ApiServer.app", host="0.0.0.0", port=8000, reload=True, use_colors=False) if __name__ == "__main__": server = ApiServer() server.run()
核心原因
Uvicorn的reload模式会在文件变更时重新加载整个模块,它需要通过模块层面的直接引用找到FastAPI实例。实例内部的self.app属于实例私有范围,模块外部无法直接访问,所以必须将app实例暴露到模块或类的层级。
内容的提问来源于stack exchange,提问作者Mhmdhoseinzade
相关产品推荐
相关产品推荐

