FastAPI 快速入门
在本文中,我们将介绍 FastAPI 框架的基本使用以及与 Pydantic 的结合,同时探讨当出现值错误时,FastAPI 如何引发内部服务器错误。
阅读更多:FastAPI 教程
什么是 FastAPI
FastAPI 是一个现代、快速(高性能)、web(基于“服务”(而不仅仅是“框架”))框架,用于构建 API。它非常易于使用,并且具有强大的类型提示功能。FastAPI 基于 Python 3.7+ 异步框架 Starlette,兼容全面的 Python 标准,包括类型注解。
FastAPI 最大的特点之一是其出色的性能。它使用了异步编程模型,并通过代码生成来减少运行时开销,从而提供了出色的性能。此外,它还提供了自动的 API 文档生成以及交互式 API 浏览器。
Pydantic 与 FastAPI
Pydantic 是一个用于数据验证和设置的库。FastAPI 使用 Pydantic 来处理请求数据的验证、类型提示和转换。借助 Pydantic,我们可以轻松地声明一个请求模型和响应模型,并通过使用这些模型来自动处理请求和响应。
在 FastAPI 中,我们可以通过在请求处理函数参数中声明 Pydantic 模型来进行数据验证和类型注解。示例如下:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.post("/items/")
async def create_item(item: Item):
return {"item": item}
在上面的示例中,我们首先定义了一个 Pydantic 模型 Item
,并使用 name
和 price
属性定义了请求的数据结构。然后,我们在 create_item
请求处理函数的参数中声明了 item: Item
,这样 FastAPI 就会根据 Item
模型进行数据校验和类型转换。
值错误引发内部服务器错误
当我们使用 FastAPI 处理请求时,如果请求的数据不符合模型定义,例如提供了错误的类型或缺少了必需的属性,FastAPI 会自动引发一个值错误(ValidationError
)。这个错误将导致内部服务器错误(Internal Server Error)的响应。
例如,考虑以下的请求处理函数:
@app.post("/items/")
async def create_item(item: Item):
return {"item": item}
如果我们向该接口发送了一个请求,但请求的数据结构不符合 Item
模型的定义,FastAPI 将自动引发一个值错误,并返回一个包含相应错误信息的内部服务器错误响应。例如,如果我们发送以下的请求体:
{
"name": "apple",
"price": "10.5"
}
由于 price
属性期望一个浮点数,但请求实际提供的是一个字符串,FastAPI 将引发一个值错误。响应将如下所示:
{
"detail": [
{
"loc": [
"body",
"price"
],
"msg": "value is not a valid float",
"type": "type_error.float"
}
]
}
这个错误消息告诉了我们在请求体中的 price
属性上出现了一个类型错误(type_error.float
),它预期一个浮点数的值,但提供的是一个无效的浮点数。
自定义异常处理程序
FastAPI 提供了自定义异常处理程序的能力,可以让我们在出现值错误时返回自定义的错误响应而不是默认的内部服务器错误响应。
为了自定义异常处理程序,我们可以使用 FastAPI 的 RequestValidationError
异常和异常处理装饰器 exception_handler
。
示例如下:
from fastapi import FastAPI, Request
from fastapi.exception_handlers import RequestValidationError
from fastapi.responses import JSONResponse
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
return JSONResponse(
status_code=400,
content={"detail": [{"loc": error["loc"], "msg": error["msg"]} for error in exc.errors()]},
)
@app.post("/items/")
async def create_item(item: Item):
return {"item": item}
在上面的示例中,我们首先导入了 Request
、RequestValidationError
、JSONResponse
类以及 exception_handler
装饰器。然后,我们在应用程序中定义了一个自定义的异常处理程序 validation_exception_handler
,用于处理值错误。最后,我们使用 exception_handler
装饰器将该自定义处理程序关联到 RequestValidationError
异常。
当 FastAPI 引发值错误时,例如上面的示例中的值错误,它将触发我们的自定义处理程序。处理程序将返回一个自定义的错误响应,例如:
{
"detail": [
{
"loc": [
"body",
"price"
],
"msg": "value is not a valid float"
}
]
}
总结
本文介绍了 FastAPI 框架的基本使用以及与 Pydantic 的结合。我们学习了如何使用 FastAPI 处理请求时的值错误以及如何自定义异常处理程序来返回自定义的错误响应。通过合理地利用 FastAPI 和 Pydantic 的功能,我们可以轻松构建出高性能、类型安全的 API。快速而又可靠的开发体验使得 FastAPI 成为越来越受欢迎的 Web 框架之一。