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,可以多选

fastapi 如何的 list 如何使用逗号分割,而不是同名键值对?

但是,这样传递 query params 的时候,就有两个 source 了 source=Manual&source=vDNA

fastapi 如何的 list 如何使用逗号分割,而不是同名键值对?

但是我希望是 source=Manual,vDNA

如何做到?


回答:

因为在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...

以上是 fastapi 如何的 list 如何使用逗号分割,而不是同名键值对? 的全部内容, 来源链接: utcz.com/p/938828.html

回到顶部