FastAPI 学习之路(五十九)封装统一的json返回处理工具

在本篇文章之前的接口,我们每个接口异常返回的数据格式都不一样,处理起来也没有那么方便,因此我们可以封装一个统一的json。

from fastapi import status
from fastapi.responses import JSONResponse, Response
from typing import Union


def resp_200(*, data: Union[list, dict, str]) -> Response:
    return JSONResponse(
        status_code=status.HTTP_200_OK,
        content={
            "code": 200,
            "message": "success",
            "data": data
        }
    )


def resp_400(*, data: str = None, message: str="BAD REQUEST") -> Response:
    return JSONResponse(
        status_code=status.HTTP_400_BAD_REQUEST,
        content={
            "code": 400,
            "message": message,
            "data": data
        }
    )

把代码统一放到common下面的json_tools.py里面,我们在接口返回的时候调用

from common.json_tools import resp_200

def create_user_method(db: Session, user: UserModel):
    db_user = db.query(User).filter(User.email == user.email).first()
    if db_user:
        return resp_200(data={"detail": "this user already exists"})
    from routers.users import get_password_hash
    hashed_password = get_password_hash(user.password)
    init_user = User(email=user.email, hashed_password=hashed_password)
    db.add(init_user)
    db.commit()
    db.refresh(init_user)
    return resp_200(data={"user": init_user.email})

我们看下处理后的效果

我们看创建重复的返回

但是我们发现code返回的都是固定的,那么我们是否可以改造下:

def response(*, code: 200, data: Union[list, dict,str], message="success") -> Response:
    return JSONResponse(
        status_code=status.HTTP_200_OK,
        content={
            "code": code,
            "message": message,
            "data": data
        }
    )

改造后,我们的返回消息,可以自定义code,message,data。接下来我们再次改造下我们的新建用户的接口

from common.json_tools import response

def create_user_method(db: Session, user: UserModel):
    db_user = db.query(User).filter(User.email == user.email).first()
    if db_user:
        return response(code=1, message="error", data="this user already exists")
    from routers.users import get_password_hash
    hashed_password = get_password_hash(user.password)
    init_user = User(email=user.email, hashed_password=hashed_password)
    db.add(init_user)
    db.commit()
    db.refresh(init_user)
    return resp_200(data={"user": init_user.email})

我们看下修改后的用户返回

这样我们就完成了统一接口响应处理,后续我们可以在所有的接口中使用。 

<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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值