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

作者站长头像
站长
· 阅读数 5
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

如何做到?

回复
1个回答
avatar
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...

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容