重新运行一个初始化函数,每次api重新加载
Re-running an initialization function for each api reload
我目前正在 运行 宁宁一个 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喧哗
我目前正在 运行 宁宁一个 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喧哗