我正在尝试创建一个类似于 /services?status=New
的端点。
status
将是 New
或者 Old
。
以下是我的代码:
from fastapi import APIRouter, Depends
from pydantic import BaseModel
from enum import Enum
router = APIRouter()
class ServiceStatusEnum(str, Enum):
new = "New"
old = "Old"
class ServiceStatusQueryParam(BaseModel):
status: ServiceStatusEnum
@router.get("/services")
def get_services(
status: ServiceStatusQueryParam = Query(..., title="Services", description="my desc"),
):
pass #my code for handling this route.....
结果是我收到了一个错误,似乎与这个问题这里有关。
错误信息显示:AssertionError:Param:状态只能是请求正文,使用Body()
然后我找到了另一个解决方案,在这里有详细的说明。
因此,我的代码将是这样的:
from fastapi import APIRouter, Depends
from pydantic import BaseModel
from enum import Enum
router = APIRouter()
class ServiceStatusEnum(str, Enum):
new = "New"
old = "Old"
class ServicesQueryParam(BaseModel):
status: ServiceStatusEnum
@router.get("/services")
def get_services(
q: ServicesQueryParam = Depends(),
):
pass #my code for handling this route.....
它正在工作(我不明白为什么)- 但问题是如何在哪里添加描述和标题?
ServiceStatusQueryParam
的目的。为什么不直接使用ServiceStatusEnum
注释您路由的status
参数呢?那样就可以工作了。你真的需要在 URL 查询参数中使用整个 JSON 对象吗?对我来说似乎非常尴尬。 - Daniil Fajnberg?status={"status":"New"}
或类似的内容,因为你将status
查询参数的类型设置为ServiceStatusQueryParam
模型,该模型反序列化为JSON对象。而你只想让查询为?status=New
,所以本质上是字符串类型,但受到枚举成员的限制。 - Daniil Fajnberg