FastAPI之响应模型

前言

响应模型我认为最主要的作用就是在自动化文档的显示时,可以直接给查看文档的小伙伴显示返回的数据格式。对于后端开发的伙伴来说,其编码的实际意义不大,但是为了可以不用再额外的提供文档,我们只需要添加一个 response_model=xxx,还是很爽的

示例

没有响应模型

from fastapi import FastAPI, Header
from pydantic import BaseModel

app = FastAPI()


class Resp(BaseModel):
    code: int
    msg: str
    data: list


@app.get("/")
async def read_root():
    return Resp(code=0, msg='success', data=[{"name": "Python"}, {"name": "Java"}])

效果
在这里插入图片描述

此时我们的文档只可以看到返回的是字符串,这和没写文档一样,现在尝试加上response_model

添加响应模型

from fastapi import FastAPI, Header
from pydantic import BaseModel

app = FastAPI()


class User(BaseModel):
    id: int
    name: str


class Resp(BaseModel):
    code: int
    msg: str
    data: list[User]


@app.get("/",response_model=Resp)
async def read_root():
    return Resp(
        code=0,
        msg='success',
        data=[
            User(id=1, name='test'),
            User(id=2, name='test2')
        ]
    )

打开自动化文档,显示效果如下:
在这里插入图片描述
此时我们需要格外注意,我们规定了返回的是Resp模型,这个模型中有code、msg、data三个字段,如果我们返回的数据缺少了一个字段,那么,请求接口的时候,就会报错,比如我们把msg='success'注释掉,再次请求,将会有错误产生:
在这里插入图片描述

进阶使用:response_model_exclude_unset

如果你不想在响应模型中包括默认值未被修改的字段,你可以使用response_model_exclude_unset参数。

@app.post("/items/exclude_unset", response_model=Item, response_model_exclude_unset=True)
async def create_item_exclude_unset(item: Item):
    return item

在这个例子中,如果你提交了一个不包含descriptiontax字段的请求(因为它们有默认值且未修改),响应将不会包含这些字段。

response_model_includeresponse_model_exclude

response_model_includeresponse_model_exclude参数让你可以更精细地控制响应数据。response_model_include指定应该包含的字段,而response_model_exclude指定应该排除的字段。

只包含特定字段

@app.post("/items/include", response_model=Item, response_model_include={"name", "price"})
async def create_item_include(item: Item):
    return item

在这个例子中,响应只会包含nameprice字段,即使其他字段在请求体中被定义。

排除特定字段

@app.post("/items/exclude", response_model=Item, response_model_exclude={"tax"})
async def create_item_exclude(item: Item):
    return item

在这个例子中,返回的响应将不包含tax字段。

实操演示

为了更好地理解这些概念,我们实现一个实例,其中我们创建一个简单的商品入库API,并在不同的端点展示response_model的不同用法。

from typing import Set

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
    tags: Set[str] = set()

# 默认的response_model使用
@app.post("/items/", response_model=Item)
async def create_item(item: Item):
    return item

# 排除未设置的字段
@app.post("/items/exclude_unset", response_model=Item, response_model_exclude_unset=True)
async def create_item_exclude_unset(item: Item):
    # 模拟item创建
    return item

# 只包含特定字段
@app.post("/items/include_only", response_model=Item, response_model_include=["name", "price"])
async def create_item_include_only(item: Item):
    # 模拟item创建
    return item

# 排除特定字段
@app.post("/items/exclude_some", response_model=Item, response_model_exclude=["tax"])
async def create_item_exclude_some(item: Item):
    # 模拟item创建
    return item

当你运行这个FastAPI应用并向这些端点发送请求时,你应该会注意到,每个端点都根据设定的参数,返回不同结构的JSON响应。

记得要调试和测试每个端点,确保它的行为符合预期,这样你就能更好地理解response_model的这些高级特性如何帮助你控制API的响应格式。

结论

response_model和其他相关参数提供了强大的方式来控制你的API响应。通过选择性地包括、排除或者隐藏响应数据的特定字段,你可以创建更加灵活和高效的API端点。这些特性尤其在处理大型数据模型或希望限制客户端收到数据的场景下非常有用。通过本教程的介绍,希望你能在自己的FastAPI项目中更加自如地使用这些高级功能。

<think>好的,我需要帮助用户了解如何使用FastAPI封装大型机器学习模型并创建API服务。首先,我应该回顾用户提供的引用内容,确保回答准确并正确引用来源。 用户提到了三个引用:[^1]介绍了FastAPI在AI模型封装中的应用,[^2]提到了FastAPI、Uvicorn和Pydantic的组合使用,[^3]提供了一个具体的YOLOv5模型封装的例子,包括Postman测试。我需要整合这些信息,给出一个结构清晰的教程。 首先,我应该按照用户的要求,分步骤讲解。可能需要包括环境准备、模型加载、接口设计、服务部署和测试等方面。要确保代码示例正确,并且符合FastAPI的最佳实践。 考虑到用户可能对FastAPI不熟悉,我需要简要说明每个步骤的目的,比如为什么使用Pydantic进行数据验证,或者Uvicorn作为服务器的重要性。同时,代码注释要详细,帮助用户理解每一部分的作用。 然后,生成相关问题。根据用户提供的示例问题,我应该围绕性能优化、异常处理、与其他框架对比、异步加载模型以及认证机制等方面提问。这些问题需要与教程内容相关,帮助用户深入理解。 需要特别注意引用标记的位置,确保在提及关键概念或步骤时正确添加引用,例如在介绍FastAPI时引用[^1],提到工具组合时引用[^2],以及在测试部分引用。 此外,要确保所有数学公式或代码块符合格式要求,比如行内公式用$...$,独立公式用$$...$$。不过在这个问题中,可能数学公式较少,主要是代码块和常规文本。 最后,检查回答是否符合中文要求,结构是否清晰,步骤是否逻辑连贯,引用是否正确自然。确保没有使用任何Markdown格式,代码块用三个反引号包围,并标明语言类型。 现在开始组织内容: 1. 环境准备:安装FastAPI、Uvicorn、Pydantic,可能还需要其他依赖如torch、transformers等。 2. 创建FastAPI应用实例,并定义模型加载函数,确保模型在启动时加载,避免重复加载。 3. 定义请求和响应模型,使用Pydantic进行数据验证,例如用户输入的文本或文件路径。 4. 编写推理接口,处理请求,调用模型进行预测,并返回结果。 5. 启动服务,使用Uvicorn运行应用。 6. 测试接口,使用Postman发送请求,检查响应是否正确。 在代码示例中,可能需要一个具体的模型,比如Hugging Face的BERT模型,处理文本分类任务。展示如何加载模型、预处理输入、推理和后处理结果。 在相关问题部分,考虑用户可能遇到的后续问题,如性能优化(异步处理、批处理)、错误处理(模型加载失败、输入校验)、扩展性(分布式部署)等。 需要确保所有引用正确,比如在介绍FastAPI时引用,在提到工具组合时引用[^2],在测试步骤提到Postman时引用[^3]。 最后检查语言是否流畅,结构是否符合要求,确保没有遗漏任何用户的要求。</think>### 使用 FastAPI 封装大模型创建 API 服务教程 以下是分步骤的实现方法,结合代码示例和关键概念说明: --- #### **1. 环境准备** 安装依赖库: ```bash pip install fastapi uvicorn pydantic python-multipart torch transformers ``` - **FastAPI**:构建 API 框架 [^2] - **Uvicorn**:高性能 ASGI 服务器 [^2] - **Pydantic**:接口参数校验工具 - `transformers`:加载预训练大模型(如 BERT、GPT) --- #### **2. 创建 FastAPI 应用并加载模型** ```python from fastapi import FastAPI, UploadFile from pydantic import BaseModel from transformers import pipeline # 初始化应用 app = FastAPI(title="大模型API服务") # 启动时加载模型(以文本生成模型为例) @app.on_event("startup") def load_model(): global model model = pipeline("text-generation", model="gpt2") # 替换为实际大模型路径 print("模型加载完成") # 定义健康检查接口 @app.get("/health") def health_check(): return {"status": "ok"} ``` --- #### **3. 定义请求/响应数据格式** 使用 Pydantic 校验输入: ```python class TextRequest(BaseModel): input_text: str max_length: int = 50 class ImageRequest(BaseModel): file: UploadFile threshold: float = 0.5 class ResponseModel(BaseModel): result: str confidence: float ``` --- #### **4. 实现推理接口** **文本生成接口示例**: ```python @app.post("/generate_text") async def generate_text(request: TextRequest): try: output = model(request.input_text, max_length=request.max_length) return ResponseModel( result=output[0]["generated_text"], confidence=1.0 ) except Exception as e: return {"error": str(e)} ``` **图像处理接口示例**(参考YOLOv5封装[^3]): ```python from PIL import Image import io @app.post("/detect_objects") async def detect_objects(request: ImageRequest): image_data = await request.file.read() image = Image.open(io.BytesIO(image_data)) # 假设已加载YOLOv5模型 results = model(image) return {"detections": results.pandas().xyxy[0].to_dict()} ``` --- #### **5. 启动服务** ```bash uvicorn main:app --host 0.0.0.0 --port 8000 --reload ``` - `--reload` 参数支持热更新(仅开发环境使用) --- #### **6. 接口测试** 使用 Postman 发送请求: 1. **POST** `http://localhost:8000/generate_text` 2. **Body** → **JSON**: ```json { "input_text": "人工智能的未来发展", "max_length": 100 } ``` 3. 查看返回的生成文本结果 --- ### **关键优化技巧** 1. **异步处理**:对 I/O 密集型操作使用 `async/await` ```python @app.post("/async_predict") async def async_predict(request: TextRequest): await preprocess(request.input_text) # 模拟异步预处理 ... ``` 2. **批处理支持**: ```python def batch_predict(texts: List[str]): return model(texts, batch_size=8) ``` 3. **模型缓存**:使用 `lru_cache` 缓存常用模型实例 --- ### **部署建议** 1. **生产环境部署**: ```bash uvicorn main:app --workers 4 --limit-concurrency 100 ``` 2. **结合 Docker** 容器化部署 3. **添加认证中间件**(参考[^1]安全实践) --- §§ 相关问题 §§ 1. 如何处理大模型的内存占用问题? 2. 如何为 FastAPI 接口添加 JWT 认证? 3. 如何实现模型的热更新而不中断服务? 4. 怎样监控 API 服务的性能指标? 5. 大模型 API 如何设计版本控制? [^1]: 在人工智能领域,将模型封装为可调用的服务接口是实现模型应用化的关键环节。 : FastAPI 是一个快速(高性能)的构建API的Web框架,Uvicorn 是高效的ASGI服务器。 [^3]: 使用 Postman 工具测试接口时需要配置与代码对应的参数格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

micro_cloud_fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值