重新运行一个初始化函数,每次api重新加载

Re-running an initialization function for each api reload

我目前正在 运行 宁宁一个 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喧哗