【问题标题】:How to inject dependencies to my custom function in FastAPI如何在 FastAPI 中将依赖项注入我的自定义函数
【发布时间】:2021-09-10 07:28:57
【问题描述】:

我有一个用于所有 websocket 路由的自定义类。它看起来像这样:

class Handler:
   async def __call__(websocket):
      await websocket.accept()
      await self.handle_websocket(websocket)

   @abc.abstractmethod
   async def handle_websocket(websocket):
      pass

所以现在我有一个问题:如果我想在 handle_websocket 函数中使用依赖项,我该怎么做?我希望能够做这样的事情:

async def __call__(websocket):
      await websocket.accept()
      container = get_dependency_injection_container()
      # here I need to pass websocket as an argument. Other arguments in handle_websocket function should be injected
      await container.call(self.handle_websocket, websocket=websocket) 

有什么想法吗?

【问题讨论】:

    标签: python dependency-injection fastapi


    【解决方案1】:

    我不确定是否可以完全按照您的建议进行操作,因为要解决依赖关系,它们必须列在路径操作的签名中(至少这是唯一的标准方式)。

    我建议您稍微改变方法并使用classes as a dependency,在__init__ 方法中获取所有必要的依赖项。

    演示:

    import abc
    from fastapi import FastAPI, WebSocket, Depends
    
    
    app = FastAPI()
    
    
    def foo_dependency() -> 42:
        return 42
    
    
    class Handler:
        def __init__(self, websocket: WebSocket):
            self.websocket = websocket
    
        async def __call__(self):
            await self.websocket.accept()
            return await self.handle_websocket()
    
        @abc.abstractmethod
        async def handle_websocket(self):
            pass
    
    
    class ConcreteHandler(Handler):
    
        def __init__(self, websocket: WebSocket, dep: int = Depends(foo_dependency)):
            super().__init__(websocket)
            self.dep = dep
    
        async def handle_websocket(self):
            return self.dep
    
    
    @app.websocket("/ws")
    async def websocket_endpoint(websocket: WebSocket, handler: ConcreteHandler = Depends()):
        print(await handler())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-11
      • 2010-11-05
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      相关资源
      最近更新 更多