FastAPI:如何在OpenAPI中获取自定义验证错误

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为整数类型,在路径中作为路径参数,以及itemItem模型类型,作为请求体参数。

我们可以通过在路由函数内进行一些自定义验证,来实现更严格的验证。例如,我们要求商品名称至少有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的开发更加高效和简单。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程