FastAPI:如何在OpenAPI中获取自定义验证错误
在本文中,我们将介绍如何在FastAPI的OpenAPI中获取自定义验证错误。
FastAPI是一个现代、快速(高性能)的Web框架,用于构建API,特别适合用于构建微服务。它基于Python类型注解,提供了强大的请求和响应验证功能。
阅读更多:FastAPI 教程
FastAPI和OpenAPI
FastAPI是基于OpenAPI(先前称为Swagger)规范构建的。OpenAPI是一种用于定义、构建和消费RESTful API的规范。借助OpenAPI,我们可以自动生成交互式的API文档、客户端代码和服务器存根。
FastAPI使我们能够通过在函数参数注解中添加验证规则,来验证请求参数。例如,我们可以使用字符串长度限制、枚举,以及自定义验证规则等。但是在默认情况下,当请求参数未通过验证时,FastAPI将自动生成默认的错误消息。
获取自定义验证错误
有时候,我们希望获得更具体的错误消息,并返回自定义的验证错误。下面是如何实现的示例:
from fastapi import FastAPI, Path, HTTPException
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
app = FastAPI()
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
if len(item.name) < 3:
raise HTTPException(status_code=400, detail="Item name should have at least 3 characters")
if item.price <= 0:
raise HTTPException(status_code=400, detail="Item price should be greater than 0")
return {"item": item}
在上面的示例代码中,我们定义了一个路由/items/{item_id}
来更新商品。在函数的参数注解中,我们定义了item_id
为整数类型,在路径中作为路径参数,以及item
为Item
模型类型,作为请求体参数。
我们可以通过在路由函数内进行一些自定义验证,来实现更严格的验证。例如,我们要求商品名称至少有3个字符,并且商品价格必须大于0。如果请求参数未通过验证,我们可以抛出HTTPException
异常,并传递自定义的错误消息。
在上面的示例中,如果商品名称少于3个字符,我们抛出一个状态码为400的异常,其中详细信息为”Item name should have at least 3 characters”。如果商品价格小于等于0,我们抛出一个状态码为400的异常,其中详细信息为”Item price should be greater than 0″。
在OpenAPI中获取自定义验证错误
在使用FastAPI时,我们可以通过访问生成的OpenAPI文档来查看API的定义和验证规则。然而,默认情况下,FastAPI将自动生成默认的错误消息,而不是显示我们自定义的验证错误消息。
为了在OpenAPI文档中显示自定义错误消息,我们可以使用FastAPI提供的RequestValidationError
异常类,来覆盖默认的错误消息。
下面是如何实现的示例:
from fastapi import FastAPI, Path, HTTPException
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
app = FastAPI()
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
if len(item.name) < 3:
raise RequestValidationError(
errors=[
{
"loc": ["item", "name"],
"msg": "Item name should have at least 3 characters",
"type": "value_error"
}
]
)
if item.price <= 0:
raise RequestValidationError(
errors=[
{
"loc": ["item", "price"],
"msg": "Item price should be greater than 0",
"type": "value_error"
}
]
)
return {"item": item}
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):
return JSONResponse(
status_code=exc.status_code,
content=jsonable_encoder({"detail": exc.errors()})
)
在上面的示例代码中,我们通过在update_item()
函数中自定义抛出RequestValidationError
异常,并提供包含错误消息的错误列表。
然后,我们使用@app.exception_handler
装饰器将错误处理程序注册到FastAPI应用程序中。在错误处理程序中,我们将错误消息返回为JSON格式,以便在错误响应中显示。
通过这种方式,我们可以在FastAPI的OpenAPI文档中展示我们自定义的验证错误消息,使API更加清晰和易于理解。
总结
通过本文,我们了解了如何在FastAPI的OpenAPI中获取自定义验证错误。我们可以通过抛出自定义的异常,并在异常中提供自定义的错误消息,来实现更严格和更具体的验证。从而在生成的OpenAPI文档中,以更清晰和易于理解的方式展示验证错误。FastAPI使我们能够轻松定义和验证API,并自动生成交互式的API文档,让API的开发更加高效和简单。