【问题标题】:How to validate ObjectId query param in FastAPI如何在 FastAPI 中验证 ObjectId 查询参数
【发布时间】:2023-02-14 04:59:54
【问题描述】:

我有一个接收端点和用于从 MongoDB _id 获取数据的 id 字段:

from fastapi import APIRouter
from bson import ObjectId

router = APIRouter()

@router.get("/get-data")
async def get_strategies(order_id: ObjectId):
    return Manager().get_data(order_id)

我想验证 order_id 是否与 ObjectId 一样有效,如果稍后在函数内部,order_idstrObjectId 没关系。

我怎样才能做到这一点? 感谢帮助!

【问题讨论】:

  • 您请求的 ObjectId 是什么样的?您是要验证它是否符合您期望的 MongoDB objectId 的外观,还是要确定它是否也是有效的 order_id? (后者是完全合理的,例如通过 order: Depends(order_from_param_order_id) 将为您提供非常可组合的视图功能)
  • @MatsLindh 感谢回答。 ObjectId 是从bson 包导入的类,我认为是 mongodb 用于 _id 字段(每个文档的主键)的同一个类。你order: Depends(order_from_param_order_id)的方法看起来也不错,我试试
  • 我不确定如何通过 JSON 正文/url 参数从二进制表示形式获取 ObjectId,因此这取决于您要提交的值类型。如果可能,您可以使用依赖项将任何输入字符串转换为 ObjectId。
  • @MatsLindh 也许我解释错了,在这种情况下我深表歉意。英语不是我的母语。我将我正在寻找的解决方案留在下面

标签: python mongodb fastapi


【解决方案1】:

我找到了这个验证器:Query,这个是用来验证http GET参数的。
还有这个验证器:Path 来验证路径参数,下面是我留下的例子:

from fastapi import APIRouter, Path, Query
from bson import ObjectId

router = APIRouter()

@router.get("/get-data")
async def get_strategies(order_id: str = Query(..., regex=r"^[0-9a-f]{24}$")):
    return Manager().get_data(order_id)


@router.get("/get-data/{order_id}")
async def get_strategies(order_id: str = Path(..., regex=r"^[0-9a-f]{24}$")):
    return Manager().get_data(order_id)
  • Query 和Path 里面的... 是表示必填参数。

  • ObjectId 是一个 24 个字符的十六进制字符串。与正则表达式匹配

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 2020-11-18
    • 2020-09-28
    • 2019-12-30
    • 2023-02-16
    • 1970-01-01
    • 2021-08-09
    相关资源
    最近更新 更多