【问题标题】:How to set paginate params via query?如何通过查询设置分页参数?
【发布时间】:2022-08-05 17:45:35
【问题描述】:

我的端点之一应该是可分页的。它本质上只是一个外部 API 的包装器,因此不幸的是有一些变通方法。

但是,我想知道如何通过查询参数设置params: Params

我希望有参数pagesize 可以在/search?page=2&size=10 中声明它们。

由于我找不到一个例子,我想我可能会问。

@search_router.get(\"/search\")
def search(query: str, params: Params = Params(size=20), response_model=Page[dict]):

    result = ris_client.service.SearchDocuments({
           \"DokumenteProSeite\": PAGE_SIZE[params.size],
           \"Seitennummer\": params.page
    })

    results = result[\"results\"]
    hits = results[\"hits\"]
    content = results[\"references\"]

    return paginate(
        content,
        params,
        length_function=lambda _: int(hits[\"value\"])
    )

我知道我可以像这样自己公开这些参数:

@search_router.get(\"/search\")
def search(query: str, size: int = 20, page: int = 0, response_model=Page[dict]):
   params = Params(size=size, page=page)
   # ...
   return paginate(
        content,
        params,
        length_function=lambda _: int(hits[\"value\"])
    )

但是为什么我几乎在每个教程的函数签名中都看到了Params 类?

  • 我猜当你看到params: Params 时,它被分配了= Depends()?即如 fastapi-pagination 教程中所示(因为您没有指定 Params 类的来源)。 response_model 也是视图装饰器 (.get) 的参数,而不是视图函数本身的参数。

标签: fastapi


【解决方案1】:

这个来自 fastapi-pagination 的 Params 只是一个小助手类,它为您做了一些预验证:

class Params(BaseModel, AbstractParams):
    page: int = Query(1, ge=1, description="Page number")
    size: int = Query(50, ge=1, le=100, description="Page size")

    def to_raw_params(self) -> RawParams:
        return RawParams(
            limit=self.size,
            offset=self.size * (self.page - 1),
        )

您可以使用它而不是将这些参数显式传递给您的端点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多