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

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应用实例上全局配置,避免每个路由重复操作:

  1. 在主文件(如main.py)中导入相关模块:
from fastapi_pagination import add_pagination
from your_module.pagination import Params, Page
  1. 创建应用后注册路由并添加全局分页:
app = FastAPI()
# 注册路由
app.include_router(routers.users.router)
app.include_router(routers.recipes.router)
# 启用全局分页支持
add_pagination(app)
  1. 恢复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:35:22