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

如何在FastAPI中用类管理API端点?现有实现遇参数缺失错误

问题解决:FastAPI CBV类初始化参数缺失报错

问题根源

使用fastapi_utils.cbv装饰类时,FastAPI会自动将类__init__方法的参数解析为请求参数或依赖项。你直接传入的database被当成了URL查询参数,所以访问/events时会提示缺失该参数。

解决方案:依赖注入配置

通过FastAPI的依赖系统,告诉框架database参数来自预实例化的对象,而非请求参数。以下是两种可行的实现方式:

方式一:依赖函数覆盖(推荐)

修改EventManager.py

from fastapi import FastAPI, Depends
from fastapi_utils.cbv import cbv
from fastapi_utils.inferring_router import InferringRouter

# 定义空的依赖函数,后续在app.py中替换为实际数据库实例
def get_database():
    raise NotImplementedError("请配置数据库依赖")

app = FastAPI()
router = InferringRouter()

@cbv(router)
class EventManager:
    # 用Depends标记database参数,指定从依赖获取
    def __init__(self, database = Depends(get_database)):
        self.__database = database
        self.__app = app

    def get_app(self) -> FastAPI:
        return self.__app

    @router.get("/events")
    def get_all_events(self) -> dict:
        return self.__database.select("SELECT * FROM events.event")

app.include_router(router)

修改app.py

from PostgresSQLConnection import PostgresSQLConnection
from EventManager import EventManager, get_database, app
import uvicorn

database = PostgresSQLConnection("src/database.ini", "postgresql")
# 覆盖依赖函数,返回预实例化的数据库对象
app.dependency_overrides[get_database] = lambda: database

# 实例化EventManager无需传参,依赖会自动注入
api = EventManager()
app = api.get_app()

if __name__ == "__main__":
    uvicorn.run("app:app", host="127.0.0.1", reload=True)

方式二:自定义依赖类型

修改EventManager.py

from fastapi import FastAPI, Depends
from fastapi_utils.cbv import cbv
from fastapi_utils.inferring_router import InferringRouter

# 定义空的依赖类,用于标记数据库类型
class Database:
    pass

app = FastAPI()
router = InferringRouter()

@cbv(router)
class EventManager:
    def __init__(self, database: Database = Depends()):
        self.__database = database
        self.__app = app

    def get_app(self) -> FastAPI:
        return self.__app

    @router.get("/events")
    def get_all_events(self) -> dict:
        return self.__database.select("SELECT * FROM events.event")

app.include_router(router)

修改app.py

from PostgresSQLConnection import PostgresSQLConnection
from EventManager import EventManager, Database, app
import uvicorn

database = PostgresSQLConnection("src/database.ini", "postgresql")
# 绑定Database类型到实际数据库实例
app.dependency_overrides[Database] = lambda: database

api = EventManager()
app = api.get_app()

if __name__ == "__main__":
    uvicorn.run("app:app", host="127.0.0.1", reload=True)

原理说明

通过app.dependency_overrides覆盖依赖定义,让FastAPI在创建EventManager实例时,自动注入你预初始化的database对象,而非从请求中提取参数,完美解决参数缺失的问题,同时保持代码的模块化和可扩展性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:03:29