【问题标题】:Re-running an initialization function for each api reload为每个 api 重新加载重新运行初始化函数
【发布时间】:2021-08-13 09:24:05
【问题描述】:

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

【问题讨论】:

  • 这有点含糊。你有任何错误吗?您指的是哪种初始化?它们包括进口吗?请尝试详细说明。没有可重现的代码可以使用。请查看stackoverflow.com/help/minimal-reproducible-example
  • @alec_djinn 很公平,给我一点时间来生成一个可运行的样本:)
  • @alec_djinn 在这里!
  • 你没有实例化你的对象,只是导入它,你确定这段代码可以工作吗?
  • 您是否尝试过挂钩startupshutdown 事件? fastapi.tiangolo.com/advanced/events

标签: python fastapi uvicorn


【解决方案1】:

正如@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 噪音

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-26
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2016-10-04
    相关资源
    最近更新 更多