主页
文章
知识库
云盘
工具
登录
登录
注册
忘记密码
反馈
文章
FastAPI清除接口返回数据中的None
FastAPI清除接口返回数据中的None
lyjin
2024-04-12
[TOC] 如果要在 FastAPI 项目中统一地处理模型序列化以自动排除所有 `None` 值,可以通过自定义响应处理来实现。 这里提供一种方法,通过自定义 FastAPI 的 `JSONResponse` 来统一排除模型中的 `None` 值: ## 方法 ### 步骤 1: 创建一个自定义的 JSON 响应类 创建一个继承自 `fastapi.responses.JSONResponse` 的自定义响应类,这个类在内部使用 Pydantic 的 `.dict()` 方法时会自动应用 `exclude_none=True`。 ```python from fastapi.responses import JSONResponse from fastapi.encoders import jsonable_encoder class CustomJSONResponse(JSONResponse): def render(self, content: any) -> bytes: return super().render(jsonable_encoder(content, exclude_none=True)) ``` ### 步骤 2: 在 FastAPI 应用中使用这个自定义响应类 当定义 FastAPI 路由时,指定使用这个自定义的响应类来自动处理排除 `None` 的功能。 ```python from fastapi import FastAPI from pydantic import BaseModel from typing import Optional, List app = FastAPI() class Item(BaseModel): name: str description: Optional[str] = None tags: List[str] = [] @app.post("/items/", response_model=Item, response_class=CustomJSONResponse) async def create_item(item: Item): return item # 直接返回模型实例 ``` 在这个示例中,所有通过 `create_item` 路由返回的响应都会自动使用 `CustomJSONResponse` 类处理,从而确保所有 `None` 值都被排除。 ## 原理 1. ** 继承和扩展:** `CustomJSONResponse` 继承自 FastAPI 的 `JSONResponse`。`JSONResponse` 是 FastAPI 默认用来发送 JSON 格式响应的类。 1. ** 修改序列化行为:** 在 `render` 方法中,`CustomJSONResponse` 使用了 `jsonable_encoder` 函数来对内容进行编码。`jsonable_encoder` 是一个用于将复杂数据类型(如 Pydantic 模型或数据库模型)转换成可以序列化为 JSON 的格式的函数。在这个函数调用中,通过设置 `exclude_none=True` 参数,确保在序列化过程中剔除所有值为 `None` 的字段。 1. ** 通用性和灵活性:** 通过使用这个自定义的响应类,在不修改每个路由函数的情况下,全局地控制 JSON 的输出格式。这种方法提供了一个统一的解决方案,使得 API 的返回数据更加符合使用者的期望,同时减少了数据传输的负担。 ## 应用场景 使用 `CustomJSONResponse` 特别适合以下情况: - 当 API 需要返回干净、简洁的 JSON 数据时,比如在公共 API 或者客户端直接消费的场景中。 - 当需要统一处理 API 响应格式,确保返回的 JSON 数据不包含任何 None 值,从而避免前端应用处理这些无用值。 - 在需要遵循特定数据标准或者协议的应用中,确保数据的一致性和可预测性。 通过这样的自定义响应处理方式,FastAPI 应用可以更灵活地控制数据输出,同时减少了需要写的样板代码量。这种方式也有助于提高应用的性能,因为它减少了传输中的数据量。
分享
×
用手机扫码分享
没有评论
请登陆后评论
新建评论
移除
关闭
提交