FastAPI中基于预定义字典实现子用例请求参数关联验证的方法
FastAPI关联参数合法性校验实现方案
你需要实现的是依赖于另一个参数取值的动态校验,FastAPI支持两种常用实现方式,可直接复用:
方案1:基于Pydantic校验(推荐,适合校验逻辑复用场景)
通过Pydantic的字段校验器可直接获取同模型下其他已校验字段的值,完美匹配关联校验需求:
from typing import Literal from fastapi import FastAPI, Form, Depends from pydantic import BaseModel, validator from typing_extensions import Annotated # 预定义用例字典 d = {'a': [1, 2], 'b': [3, 4]} # 提取一级用例合法值集合 USECASE_CHOICES = tuple(d.keys()) app = FastAPI() # 定义参数校验模型 class UsecaseRequest(BaseModel): usecase: Literal[USECASE_CHOICES] subusecase: int @validator('subusecase') def subusecase_match_usecase(cls, v, values): # 若usecase本身校验不通过则跳过当前校验 if 'usecase' not in values: return v valid_subs = d[values['usecase']] if v not in valid_subs: raise ValueError(f"usecase为{values['usecase']}时,subusecase仅允许取值:{valid_subs}") return v # 绑定Form参数解析依赖 async def parse_form( usecase: str = Form(...), subusecase: int = Form(...) ): return UsecaseRequest(usecase=usecase, subusecase=subusecase) # 接口定义 @app.post("/documents") async def data(request: Annotated[UsecaseRequest, Depends(parse_form)]): return {"usecase": request.usecase, "subusecase": request.subusecase}
校验效果:
- 传入
usecase=a&subusecase=2时请求正常 - 传入
usecase=a&subusecase=3时自动返回422校验错误 - 传入非法usecase值时优先触发一级参数校验,返回对应错误
方案2:轻量直接校验(适合逻辑简单无需复用场景)
如果校验逻辑仅用于当前接口,可直接在路径函数内做判断:
from typing import Literal from fastapi import FastAPI, Form, HTTPException d = {'a': [1, 2], 'b': [3, 4]} USECASE_CHOICES = tuple(d.keys()) app = FastAPI() @app.post("/documents") async def data( usecase: Literal[USECASE_CHOICES] = Form(...), subusecase: int = Form(...) ): if subusecase not in d[usecase]: raise HTTPException( status_code=422, detail=f"usecase为{usecase}时,subusecase仅允许取值:{d[usecase]}" ) return {"usecase": usecase, "subusecase": subusecase}
内容的提问来源于stack exchange,提问作者Alexander Vedmed'
相关产品推荐
相关产品推荐

