4. FastAPI 框架入门:安装、路由与自动文档

FastAPI 是一个现代、高性能的 Python Web 框架,专为构建 API 而生。它基于 Starlette(异步网络能力)和 Pydantic(数据校验与序列化),天然支持异步编程,并自动生成符合 OpenAPI 规范的交互式文档。在精算模型部署场景中,FastAPI 的低延迟特性与自动校验能力,使其成为将精算引擎暴露为 RESTful 服务的首选框架。

4.1 FastAPI 安装与 Hello World

FastAPI 的安装极为简洁,推荐使用 pip 在虚拟环境中进行。生产环境还需安装 ASGI 服务器(如 Uvicorn)以运行应用。

安装命令:
pip install fastapi uvicorn

验证安装:python -c "import fastapi; print(fastapi.__version__)"

以下是一个完整的 Hello World 应用,演示了 FastAPI 的最小化启动流程:

# main.py
from fastapi import FastAPI

app = FastAPI(title="精算模型 API", version="1.0.0")

@app.get("/")
async def root():
    return {"message": "Hello, Actuarial World!"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

启动服务:python main.py,访问 http://127.0.0.1:8000 即可看到 JSON 响应。

关键点:FastAPI 应用实例 app 是核心入口;@app.get("/") 装饰器将函数绑定到 HTTP GET 方法及根路径;异步函数 async def 并非强制,但推荐用于 I/O 密集型精算计算。

4.2 路由与请求响应模型

路由(Route)是 URL 路径与处理函数之间的映射。FastAPI 支持路径参数、查询参数、请求体等多种数据来源,并通过类型注解自动完成校验与转换。

4.2.1 路径参数与查询参数

参数类型 URL 示例 函数签名 说明
路径参数 /models/{model_id} async def get_model(model_id: int) 从 URL 路径中提取,自动类型转换
查询参数 /models?version=2.0 async def list_models(version: str = "1.0") 从 URL 问号后提取,可设置默认值
请求体 POST /calculate async def calculate(data: InputSchema) 通过 Pydantic 模型接收 JSON 数据

示例代码:

from fastapi import FastAPI, Query
from pydantic import BaseModel

app = FastAPI()

class PremiumInput(BaseModel):
    age: int
    sum_assured: float
    gender: str = "M"

@app.get("/models/{model_id}")
async def get_model(model_id: int, version: str = Query("1.0", description="模型版本号")):
    return {"model_id": model_id, "version": version}

@app.post("/calculate")
async def calculate_premium(data: PremiumInput):
    # 模拟精算计算
    premium = data.sum_assured * 0.05 * (1.1 if data.gender == "M" else 0.9)
    return {"premium": round(premium, 2)}
避坑提示:路径参数必须与 URL 中的变量名一致;查询参数若未提供默认值,则视为必填项,FastAPI 会自动返回 422 校验错误。

4.2.2 请求与响应模型

FastAPI 的请求-响应生命周期遵循以下流程:

  1. 接收请求:ASGI 服务器(Uvicorn)将 HTTP 请求解析为 ASGI Scope。
  2. 路由匹配:FastAPI 根据请求方法 + 路径查找对应的路径操作函数。
  3. 参数提取与校验:自动从路径、查询、请求头、请求体中提取参数,并通过 Pydantic 模型进行类型校验。
  4. 业务逻辑执行:调用路径操作函数,执行精算计算或模型推理。
  5. 响应序列化:函数返回值自动转换为 JSON(或指定响应模型),并设置 HTTP 状态码。
FastAPI 请求-响应生命周期 HTTP 请求 路由匹配 参数校验 业务逻辑 响应序列化 HTTP 响应 说明: 校验失败时直接返回 422 错误,不进入业务逻辑;响应序列化自动处理 Pydantic 模型与 JSON 转换。

4.3 自动 API 文档生成

FastAPI 最突出的特性之一是零配置自动生成 API 文档。框架基于 OpenAPI 规范(原 Swagger)和 JSON Schema,自动从路由定义、Pydantic 模型、参数注解中提取元数据,生成交互式文档页面。

4.3.1 内置文档界面

启动应用后,FastAPI 默认提供两个文档入口:

文档类型 URL 路径 技术栈 特点
Swagger UI /docs Swagger UI + OAuth2 交互式测试面板,支持 Try it out 直接发送请求
ReDoc /redoc ReDoc 三栏式布局,适合阅读和打印
OpenAPI JSON /openapi.json 纯 JSON 机器可读,可导入 Postman、Insomnia 等工具

4.3.2 文档内容来源

文档的丰富程度取决于开发者在代码中提供的元数据:

  • 路径操作装饰器参数:summary、description、tags、response_description。
  • Pydantic 模型字段:Field(description=...)、Field(example=...)、Field(ge=0, le=100) 等约束。
  • 查询参数注解:Query(description=..., deprecated=True)。
  • 响应模型:response_model=OutputSchema 定义返回结构。

示例:为精算接口添加文档元数据

from fastapi import FastAPI, Query, Path
from pydantic import BaseModel, Field

app = FastAPI(title="精算定价 API", description="用于保险产品定价的精算模型接口", version="2.0.0")

class PricingInput(BaseModel):
    age: int = Field(..., ge=18, le=100, description="被保险人年龄(18-100)")
    sum_assured: float = Field(..., gt=0, description="保额(元)")
    smoking: bool = Field(False, description="是否吸烟")

class PricingOutput(BaseModel):
    premium: float = Field(..., description="计算所得保费")
    loading: float = Field(0.0, description="风险附加费")

@app.post("/pricing", summary="保费计算", description="根据年龄、保额、吸烟状态计算保费", 
          response_model=PricingOutput, tags=["定价"])
async def calculate_pricing(data: PricingInput):
    base = data.sum_assured * 0.03
    loading = base * 0.2 if data.smoking else 0.0
    return PricingOutput(premium=round(base + loading, 2), loading=round(loading, 2))
最佳实践:为每个接口添加 summary 和 tags,为每个模型字段添加 description 和 example,可使文档对业务人员和非技术用户更加友好。精算模型接口尤其需要明确参数单位与取值范围。
FastAPI 自动文档生成架构 代码定义层 • 路径操作装饰器 • Pydantic 模型 • 参数注解 • 响应模型 • 元数据参数 FastAPI 引擎 解析路由 提取 Schema 生成 OpenAPI JSON 注入文档 UI 文档输出层 /docs (Swagger UI) /redoc (ReDoc) /openapi.json

4.4 本章小结

通过本章学习,你已掌握 FastAPI 的核心入门技能:

  • 安装与启动:使用 pip install fastapi uvicorn 搭建最小化 API 服务。
  • 路由与参数:路径参数、查询参数、请求体三种数据来源的声明方式与自动校验机制。
  • 请求-响应生命周期:从 HTTP 请求到业务逻辑再到 JSON 响应的完整链路。
  • 自动文档:零配置获得 Swagger UI、ReDoc 和 OpenAPI JSON,大幅降低前后端协作成本。