我目前正在运行一个api项目(fastapi
与uvicorn
一起服务),在启动时完成一系列初始化。
如果我设置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?)方法是挂接fastapi
的startup
事件,使初始化在每次重新加载时运行。
我的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噪音