Uvicorn开启reload时FastAPI项目初始化函数未自动重执行问题
问题原因
uvicorn 开启reload=True时采用父子双进程架构:
- 父进程仅执行一次
if __name__ == "__main__"代码块,负责监听文件变更 - 每次代码更新触发重载时,父进程仅重启子进程加载新代码,子进程不会执行
if __name__ == "__main__"块下的初始化逻辑,因此会出现类未初始化的报错。
解决方案
方案1:使用FastAPI生命周期钩子(最推荐)
这是FastAPI官方推荐的初始化逻辑写法,不管是否开启重载都能正常执行,修改api.py即可:
from contextlib import asynccontextmanager from fastapi import FastAPI from my_class import MyClass @asynccontextmanager async def lifespan(app: FastAPI): # 应用启动时自动执行初始化 MyClass.initialize() yield # 此处可添加应用关闭时的清理逻辑,不需要可留空 app = FastAPI(lifespan=lifespan) @app.get("/stuff") def api_stuff() -> None: return MyClass.do_stuff()
每次重载重启子进程时,FastAPI实例初始化都会自动触发生命周期钩子执行初始化逻辑。
方案2:调整初始化逻辑位置
如果不想把初始化逻辑放到API模块,可以修改main.py把初始化逻辑移出__main__块,同时直接传递应用实例给uvicorn:
import uvicorn from my_class import MyClass from api import app def init_stuff() -> None: MyClass.initialize() # 初始化逻辑放全局作用域,子进程加载模块时会自动执行 init_stuff() if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=10000, reload=True)
内容的提问来源于stack exchange,提问作者HitLuca
相关产品推荐
相关产品推荐

