如何在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
相关产品推荐
相关产品推荐

