You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI中如何向自定义WebSocket处理类的方法注入依赖?

方案1:使用FastAPI原生依赖注入能力

FastAPI内置的依赖解析工具支持WebSocket场景,不需要引入额外第三方容器即可实现你要的效果:

import abc
from fastapi import WebSocket, Depends
from fastapi.dependencies.utils import solve_dependencies

class Handler:
    async def __call__(self, websocket: WebSocket):
        await websocket.accept()
        # 解析handle_websocket方法的所有依赖
        solved = await solve_dependencies(
            request=websocket,
            dependant=self.handle_websocket,
            dependency_overrides_provider=None
        )
        values, errors, *_ = solved
        if errors:
            await websocket.close(code=1008)
            return
        await self.handle_websocket(**values)

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

子类使用示例:

# 示例依赖
async def get_db_session():
    # 模拟数据库会话生成逻辑
    session = AsyncSession()
    try:
        yield session
    finally:
        await session.close()

# 业务实现类
class ChatHandler(Handler):
    async def handle_websocket(self, websocket: WebSocket, db = Depends(get_db_session)):
        # db参数会被自动注入,无需手动传递
        while True:
            msg = await websocket.receive_text()
            await websocket.send_text(f"已接收消息:{msg}")
方案2:使用第三方DI容器(以dependency-injector为例)

如果你项目中已经使用了第三方DI容器,直接调用容器提供的执行方法,传入手动参数websocket即可,其余参数容器会自动完成注入:

# DI容器定义示例
from dependency_injector import containers, providers
from sqlalchemy.ext.asyncio import AsyncSession

class AppContainer(containers.DeclarativeContainer):
    db_session = providers.Factory(AsyncSession)

# 全局容器获取方法
def get_dependency_injection_container() -> AppContainer:
    return AppContainer()

# Handler类实现
class Handler:
    async def __call__(self, websocket: WebSocket):
        await websocket.accept()
        container = get_dependency_injection_container()
        # 仅传手动参数websocket,其余依赖由容器自动填充
        await container.call(self.handle_websocket, websocket=websocket)

    @abc.abstractmethod
    async def handle_websocket(self, websocket: WebSocket, db_session: AsyncSession):
        pass
注意事项
  • 你提供的初始代码中类实例方法缺失了self参数,需要先修正,否则会出现调用参数不匹配的报错
  • 可以在__call__方法中增加异常捕获逻辑,依赖注入或业务执行出错时主动关闭WebSocket连接,避免连接泄漏

内容的提问来源于stack exchange,提问作者Ruberoid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:09:00