我想将在 Uvicorn 服务器启动期间创建的对象传递给由该 uvicorn 实例(FastApi/Starlette)运行的应用程序。一开始,我准备了继承Uvicorn服务器的类:
class ActionServer(uvicorn.Server):
def __init__(self, config, pipes: dict):
self.pipes = pipes
super(ActionServer, self).__init__(config)
然后我以编程方式启动服务器:
def run(pipes: dict):
config = Config(app="app.main:app", loop="asyncio", host=API_LISTEN_IP, port=API_LISTEN_PORT, reload=True, reload_dirs=['app'])
server = ActionServer(config, pipes)
server.run()
我的应用程序类也继承自 FastApi:
class ActionFastApi(FastAPI):
def __init__(self):
self.pipes = None
super().__init__()
但我不知道如何将管道实例从 Uvicorn 传递到应用程序。在 Uvicorn 实例中,我尝试制作如下内容:
self.config.loaded_app.app.pipes = self.pipes
但是在init ()、run() 或 serve() 方法中,loaded_app 仍然不存在。这里方法执行的顺序:
Server __init__()
Server run()
Server serve()
App __init__()
加载应用程序时,Uvicorn 内部是否会引发任何事件?或者也许 App 可以访问它正在运行的服务器实例?我无法在文档中找到此信息。