FastAPI 接口字段校验
1. 自定义错误处理
你可以通过 自定义异常处理器 来捕获校验错误。这样,错误信息不会直接由 FastAPI 返回,而是通过你定义的格式返回给客户端。
from fastapi import FastAPI, Request
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from pydantic import BaseModel, Field
from typing import Literal, Optional
app = FastAPI()
# 定义 Pydantic 数据模型
class DetectionModeKeywordRequest(BaseModel):
text: str = Field(..., min_length=1, max_length=5000, description="待检测文本")
mode: Literal["strict", "loose"] = Field(..., description="检测模式")
threshold: Optional[float] = Field(0.5, ge=0, le=1, description="阈值范围 0~1")
# 自定义异常处理,处理输入校验错误
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
# 提取字段错误信息
errors = {}
for err in exc.errors():
field = err["loc"][-1] # 获取字段名
message = err["msg"] # 错误信息
errors[field] = message # 以字段名为键,错误信息为值
# 返回自定义的错误格式
return JSONResponse(
status_code=422,
content={
"code": 422,
"message": "Parameter validation failed",
"errors": errors
}
)
# 正常的接口逻辑
@app.post("/alg/detection_mode_keyword")
async def extract_detection_mode_keyword(req: DetectionModeKeywordRequest):
return {
"message": "success",
"text": req.text,
"mode": req.mode,
"threshold": req.threshold
}
2. 校验错误的返回结果
假设客户端发送的请求体如下(包含错误字段):
{
"text": "",
"mode": "invalid_mode"
}
返回的错误响应将是:
{
"code": 422,
"message": "Parameter validation failed",
"errors": {
"text": "ensure this value has at least 1 characters",
"mode": "Input should be 'strict' or 'loose'"
}
}
3. 解释
RequestValidationError是 FastAPI 内部抛出的异常,表示请求数据不符合 Pydantic 模型定义。- 通过
@app.exception_handler(RequestValidationError)处理该异常,允许你捕获并返回自定义格式的错误信息。 - 通过
exc.errors()获取校验错误的详细信息,loc表示错误字段,msg表示错误的具体描述。 - 通过
JSONResponse返回给客户端一个自定义的错误结构,这样客户端可以更容易地解析和处理错误。
4. 完整流程
- 用户提交请求时,FastAPI 会自动将请求体解析到 Pydantic 模型
DetectionModeKeywordRequest。 - 如果输入不符合模型定义(比如
text为空或mode不合法),FastAPI 会触发RequestValidationError异常。 - 异常被我们定义的异常处理器捕获,校验错误信息被提取并按预定格式返回。
- 客户端根据返回的错误信息,处理相应的用户界面提示或其他操作。
这种方式让你能够:
- 控制错误信息的格式。
- 提供清晰的字段级错误信息,让客户端能够精确地知道哪个字段输入不合法。
- 避免了 FastAPI 默认的 422 错误格式,给出更符合你项目需求的错误结构。
如果你有其他需求,或者想要扩展这个错误处理功能,欢迎随时告诉我!

浙公网安备 33010602011771号