【发布时间】:2021-08-13 09:24:05
【问题描述】:
我目前正在运行一个 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!)
【问题讨论】:
-
这有点含糊。你有任何错误吗?您指的是哪种初始化?它们包括进口吗?请尝试详细说明。没有可重现的代码可以使用。请查看stackoverflow.com/help/minimal-reproducible-example
-
@alec_djinn 很公平,给我一点时间来生成一个可运行的样本:)
-
@alec_djinn 在这里!
-
你没有实例化你的对象,只是导入它,你确定这段代码可以工作吗?
-
您是否尝试过挂钩
startup和shutdown事件? fastapi.tiangolo.com/advanced/events