每次重新加载api时重新运行初始化函数



我目前正在运行一个api项目(fastapiuvicorn一起服务),在启动时完成一系列初始化。

如果我设置reload=True作为我的uvicorn启动函数的参数,我的api正确识别代码更改并重新加载。问题是,当我重新加载api时,我没有得到初始化,这最终打破了我的工作流程,并有效地阻止了我使用我认为非常有用的功能。

的例子:

# fastapi app object is located in another module
def main() -> None:
various_initializations()

if __name__ == "__main__":
main()
uvicorn.run("my.project.location.for:app", host="0.0.0.0", port=my_port, reload=True)

在这种情况下,我需要我的main函数在每次重新加载时运行。

编辑:

可测试的例子

main.py

import uvicorn
from my_class import MyClass

def init_stuff() -> None:
MyClass.initialize()

if __name__ == "__main__":
init_stuff()
uvicorn.run("api:app", host="0.0.0.0", port=10000, reload=True)

my_class.py

class MyClass:
initialized = False

@staticmethod
def initialize() -> None:
MyClass.initialized = True
@staticmethod
def do_stuff() -> None:
if not MyClass.initialized:
raise ValueError("not initialized!")
print("doing stuff")

api.py

from fastapi import FastAPI
from my_class import MyClass
app = FastAPI()

@app.get("/stuff")
def api_stuff() -> None:
return MyClass.do_stuff()

reload=False,如果我击中/stuff端点,我得到一个正确的行为(doing stuff被打印在终端上)。对于reload=True,我得到一个异常,表明MyClass尚未初始化(ValueError: not initialized!)

正如@MatsLindh建议的那样,(a?)方法是挂接fastapistartup事件,使初始化在每次重新加载时运行。

我的main.py文件现在看起来像这样:

import uvicorn
from my_class import MyClass
from api import app
@app.on_event("startup")
def init_stuff() -> None:
MyClass.initialize()

if __name__ == "__main__":
uvicorn.run("api:app", host="0.0.0.0", port=10000, reload=True)

快乐api噪音

最新更新