fastapi 如何的 list 如何使用逗号分割,而不是同名键值对?
from enum import Enum
from typing import Any
from datetime import datetime
from pydantic import BaseModel, Field
class VerifyStatus(Enum):
PENDING_MATCH = 'pending_match'
MATCH = 'match'
NO_MATCH = 'no_match'
PENDING_NO_MATCH = 'pending_no_match'
MANUAL_MATCH = 'manual_match'
MANUAL_NO_MATCH = 'manual_no_match'
PENDING = 'pending'
CLOES = 'close'
REMOVE = 'remove'
class Source(Enum):
MANUAL = 'Manual'
vDNA = 'vDNA'
TEXT_MATCH = 'text-match'
class Assignee(Enum):
NOT_ASSIGNED = 'not_assigned'
Alice = 'Alice'
Bella = 'Bella'
from datetime import datetime
from fastapi import APIRouter
from fastapi import Query
from fastapi import UploadFile, File
from fastapi.requests import Request
from apps.schemas import companies
from apps.schemas import VerifyStatus, Source, Assignee
review = APIRouter(tags=["dna"], prefix='/review')
@review.get('/list', summary='获取待审核列表')
def list_await_review(
req:Request,
assignee: Assignee = Query(default=Assignee.NOT_ASSIGNED),
company: list[int] = Query(default=[], description=f'company_id, 可选: /dev/company'),
cursor: int | None = Query(default=None, description='翻页,等于数据库的 offset'),
domain_is_enabled: bool = Query(default=True),
pagesize: int = Query(default=50),
series_img_status: str | None = Query(default=None),
source: list[Source] | None = Query(default=None),
tmd: str | None = Query(default=None),
verify: list[VerifyStatus] = Query(
default=VerifyStatus.PENDING_MATCH, description='验证状态(Verify status )'),
confirm_start: datetime | None = Query(default=None),
confirm_end: datetime | None = Query(default=None),
created_start: datetime | None = Query(default=None),
created_end: datetime | None = Query(default=None),
score_min: int | None = Query(default=None),
score_max: int | None = Query(default=None),
):
"""
assignee=not_assigned&company=1570,1629,55,8,14,20,1296,1447,1591,1355&
cursor=&domain_is_enabled=true&pagesize=50&series_img_status=&source=&
tmd=&verify=pending_match&=&confirm_start=&confirm_end=&created_start=&
created_end=&score_min=0&score_max=99999
"""
from loguru import logger
logger.debug(verify)
return req.query_params
比如这个 source,可以多选
但是,这样传递 query params 的时候,就有两个 source 了 source=Manual&source=vDNA
但是我希望是 source=Manual,vDNA
如何做到?
回复
1个回答
test
2024-07-05
因为在http params规范中,确实可以允许一个参数多次出现,然后被解析成list,如: ?a=1&a=2
被解析成 a: ['1', '2']
,如果你想要使用非标准的实现,那么你必须自己实现这个解析过程,有两种方案可以做到。
第一种是你将这个参数声明成string
类型,然后自己做判断解析,如:
# ...
source: Optional[str] = Query(None, description="请用`,`分割多个参数,如`Manual,vDNA,text-match`")
# ...
parsed_source = source.split(",") if source else []
# ...
另一种是你自己声明一个dependency,自己做解析和验证,而官方的这个issue的方案你几乎可以直接拿来用: https://github.com/tiangolo/fastapi/issues/406
这个你也可以参考,在全局中调整list解析方式: https://github.com/tiangolo/fastapi/issues/50
另: 目前官方文档建议新版本fastapi使用Annotated
代替直接用Query
声明参数类型,它有更多特性: https://fastapi.tiangolo.com/tutorial/query-params-str-valida...
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容