You need to enable JavaScript to run this app. Uvicorn开启reload时FastAPI项目初始化函数未自动重执行问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 20:09:02