FastAPI报错RuntimeError: Use params or add_pagination求助
解决FastAPI分页RuntimeError: Use params or add_pagination问题
问题描述
开发第二个FastAPI项目时遇到RuntimeError: Use params or add_pagination错误:
routers.users.py中的分页代码正常运行,Swagger文档能显示limit和page参数;routers.recipes.py初始状态下Swagger无分页参数,添加Dependencies后参数显示正常,但错误依旧存在。
相关代码
routers.users.py
@router.get('/', response_model=Page[Users]) async def get_all_users(db: Session = Depends(get_db)): return paginate(db.query(models.User).order_by(models.User.id))
routers.recipes.py
@router.get('/', response_model=Page[PostRecipes], dependencies=[Depends(Params)]) async def get_all_recipes(db: Session = Depends(get_db)): return paginate(db.query(models.Recipe).order_by(models.Recipe.id))
pagination模块
class Params(BaseModel, AbstractParams): page: int = Query(1, ge=1, description="Page number") limit: int = Query(50, ge=1, le=100, description="Page size") def to_raw_params(self) -> RawParams: return RawParams( limit=self.limit, offset=self.limit * (self.page - 1), ) class Page(BasePage[T], Generic[T]): page: conint(ge=1) # type: ignore limit: conint(ge=1) # type: ignore __params_type__ = Params @classmethod def create( cls, items: Sequence[T], total: int, params: AbstractParams, ) -> Page[T]: if not isinstance(params, Params): raise ValueError("Page should be used with Params") return cls( total=total, items=items, page=params.page, limit=params.limit, ) __all__ = [ "Params", "Page", ]
解决方案
问题核心是paginate函数需要获取分页参数实例才能正常工作,仅把Params加入dependencies只会让FastAPI验证参数,不会将实例传递给paginate。以下两种方案均可解决:
方案一:视图函数直接注入Params参数
修改routers.recipes.py,将Params作为参数注入并传递给paginate:
@router.get('/', response_model=Page[PostRecipes]) async def get_all_recipes(db: Session = Depends(get_db), params: Params = Depends()): return paginate(db.query(models.Recipe).order_by(models.Recipe.id), params=params)
此写法无需额外添加dependencies,Swagger会自动显示分页参数,同时paginate能获取到正确的参数实例。
方案二:全局注册分页支持
若多个路由需使用分页,可在FastAPI应用实例上全局配置,避免每个路由重复操作:
- 在主文件(如
main.py)中导入相关模块:
from fastapi_pagination import add_pagination from your_module.pagination import Params, Page
- 创建应用后注册路由并添加全局分页:
app = FastAPI() # 注册路由 app.include_router(routers.users.router) app.include_router(routers.recipes.router) # 启用全局分页支持 add_pagination(app)
- 恢复
routers.recipes.py的写法(与users路由一致即可):
@router.get('/', response_model=Page[PostRecipes]) async def get_all_recipes(db: Session = Depends(get_db)): return paginate(db.query(models.Recipe).order_by(models.Recipe.id))
内容的提问来源于stack exchange,提问作者Konstantinos
相关产品推荐
相关产品推荐

