FastAPI框架中自带了Query参数验证,可以使用长度、正则来要求用户输入的内容规则,但是默认情况下,如果用户输入的内容不符的话,会直接抛出422 http状态码,再带一个detail描述信息,这样很不好。因为这不是业务全局给调用方响应的返回标准(一般会返回一个code码、message提示信息以及业务数据),此时我们就需要使用自定义请求验证异常来接触框架自身的RequestValidationError。官网也有示例:https://fastapi.tiangolo.com/tutorial/handling-errors/?h=+exception 我这里在其基础上进行了一些优化处理。如下:本文地址:http://www.04007.cn/article/923.html,未经许可,不得转载.
#使用自定义RequestValidationError from fastapi import FastAPI, Request, status from fastapi.encoders import jsonable_encoder from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse from pydantic import BaseModel app = FastAPI() #定义接管RequestValidationError的方法 @app.exception_handler(RequestValidationError) async def validation_exception_handler(request: Request, exc: RequestValidationError): #RequestValidationError输出的内容太累赘,很多重复的东西,我这里只取干货。 message = "" for error in exc.errors(): message += ".".join(error.get("loc")) + ":" + error.get("msg") + ";" #返回 return JSONResponse( status_code=status.HTTP_200_OK, message={ "detail": exc.errors(), "body": exc.body} ), )本文地址:http://www.04007.cn/article/923.html,未经许可,不得转载.
如上代码,使用@app.exception_handler(RequestValidationError)定义接管RequestValidationError的方法,默认RequestValidationError输出的内容太累赘,字段也很多,包括loc字段、msg、type以及ctx中还会专门输出比如定义的pattern正则表达式,实际在msg中也有输出。很多重复,我这里只取干货,把loc问题位置以及问题描述msg取出来即可。注:exc.errors()能拿到所有错误列表,exc.body能拿到用户请求的参数。这样前端调用就会得到一个200响应,code展示错误码,message中展示错误原因。本文地址:http://www.04007.cn/article/923.html,未经许可,不得转载.
{ "code": 900, "message": "body.token:string does not match regex \"^[A-Z]{32}$\" "data": {} }本文地址:http://www.04007.cn/article/923.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/923.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |