fastapi 如何优雅的把 query params 的空字符转成 None?

@review.get('/api/in_process/', summary='获取待审核列表')
def list_await_review(
    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),
):
    pass

比如这样一个接口,前端传过来可能是这样 /api/in_process/?confirm_start=&confirm_end=&created_start=&created_end=&score_min=&score_max=

这样会导致,confirm_start、score_min 被视为空字符 '' 导致 422 错误

所以,我可以怎么优雅的让 fastapi 把 confirm_start=&confirm_end= 设为 None,而不是空字符呢?

阅读 3.1k
2 个回答

你可以自定义的 FastAPI 依赖项来处理空字符串

from typing import Optional
from fastapi import FastAPI, Depends, Query
from datetime import datetime

app = FastAPI()

def empty_to_none(query_param: Optional[str]) -> Optional[str]:
    if query_param == "":
        return None
    return query_param

@app.get("/api/in_process/")
async def list_await_review(
    confirm_start: Optional[datetime] = Depends(lambda: empty_to_none(Query(None))),
    confirm_end: Optional[datetime] = Depends(lambda: empty_to_none(Query(None))),
    created_start: Optional[datetime] = Depends(lambda: empty_to_none(Query(None))),
    created_end: Optional[datetime] = Depends(lambda: empty_to_none(Query(None))),
    score_min: Optional[int] = Depends(lambda: empty_to_none(Query(None))),
    score_max: Optional[int] = Depends(lambda: empty_to_none(Query(None))),
):
    # 处理查询逻辑
    pass

虽然我明白你的需求,但是我还是建议不修改这里,判断直接使用=="",来判断,因为能够第一眼就知道这个参数是字符串,其次就是query查询本来就是字符串查询

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题