FastAPI 中如何使用 RequestValidationError?

推荐答案

在 FastAPI 中,RequestValidationError 是一个异常类,用于处理请求数据验证失败的情况。当请求数据不符合预期的模型或类型时,FastAPI 会自动抛出 RequestValidationError 异常,并返回一个包含错误信息的 HTTP 400 响应。

要自定义处理 RequestValidationError,可以使用 FastAPI 的异常处理器(exception handler)。以下是一个示例:

-- -------------------- ---- -------
---- ------- ------ -------- -------- ------
---- ------------------ ------ ----------------------
---- ----------------- ------ ------------

--- - ---------

----------------------------------------------
----- --- ------------------------------------- -------- ---- ------------------------
    ------ -------------
        -------------------------------------------------
        ------------------ ------------- ------- ----------
    -

--------------------
----- --- ----------------- ------
    ------ -------- -----

在这个示例中,我们定义了一个 validation_exception_handler 函数来处理 RequestValidationError 异常。当请求数据验证失败时,FastAPI 会调用这个处理器,并返回一个包含错误详情和请求体的 JSON 响应。

本题详细解读

1. RequestValidationError 的作用

RequestValidationError 是 FastAPI 中用于处理请求数据验证失败的异常类。当请求数据不符合预期的模型或类型时,FastAPI 会自动抛出这个异常。例如,如果请求体缺少必需的字段或字段类型不匹配,FastAPI 会抛出 RequestValidationError

2. 自定义异常处理器

FastAPI 允许开发者自定义异常处理器来处理特定的异常。通过使用 @app.exception_handler 装饰器,我们可以为 RequestValidationError 定义一个自定义的处理器。在这个处理器中,我们可以返回自定义的错误响应。

3. 返回自定义错误响应

在自定义的异常处理器中,我们可以返回一个 JSONResponse,其中包含错误详情和请求体。exc.errors() 方法返回一个包含所有验证错误的列表,而 exc.body 返回请求体数据。这样,客户端可以清楚地了解请求数据验证失败的原因。

4. HTTP 状态码

在处理 RequestValidationError 时,通常返回的 HTTP 状态码是 422 Unprocessable Entity。这个状态码表示服务器理解请求实体的内容类型,并且请求实体的语法是正确的,但无法处理包含的指令。

5. 示例代码解析

在示例代码中,我们定义了一个 create_item 路由,它接受一个字典类型的 item 作为请求体。如果请求体不符合预期,FastAPI 会抛出 RequestValidationError,并调用我们定义的 validation_exception_handler 处理器。处理器返回一个包含错误详情和请求体的 JSON 响应。

通过这种方式,我们可以灵活地处理请求数据验证失败的情况,并为客户端提供详细的错误信息。

纠错
反馈