如何使用ORJSONResponse增强FastAPI应用性能:转换任意类型为JSON

news2024/11/13 21:33:39

在FastAPI中,ORJSONResponse 是一种自定义响应类型,它使用 orjson 库来提高 JSON 数据的序列化性能。orjson 是一个快速且正确的 Python JSON 库,它支持 dataclassdatetimenumpy 等数据类型的序列化。使用 ORJSONResponse 可以提升 API 响应速度,尤其是在处理大量数据时。
在这里插入图片描述

ORJSONResponse 类在 FastAPI 中是用来将响应数据序列化为 JSON 格式并返回给客户端的。它可以处理多种类型的输入数据,包括字典、列表、Pydantic 模型等,并将它们转换为 JSON 格式。然而,并不是所有任意类型的数据都可以被自动序列化为 JSON。可序列化的数据通常包括:

  • 基本数据类型(如整数、浮点数、字符串、布尔值)
  • 列表和元组
  • 字典
  • Pydantic 模型
  • datetime 对象
  • 一些特殊的数据类型,如 UUIDdatetime 等,只要它们有相应的 JSON 序列化方法。

使用 ORJSONResponse 的方法如下:

  1. 首先,需要安装 orjson 库,可以通过 pip install orjson 命令进行安装。
  2. 在 FastAPI 应用中,通过导入 ORJSONResponse 并将其作为路径操作装饰器的 response_class 参数来使用。

示例代码如下:

from fastapi import FastAPI
from fastapi.responses import ORJSONResponse

app = FastAPI()

@app.get("/items/", response_class=ORJSONResponse)
async def read_items():
    return [{"item_id": "Foo"}]

在这个例子中,当客户端请求 /items/ 路径时,FastAPI 会使用 ORJSONResponse 来序列化响应数据,并将其发送给客户端。使用 ORJSONResponse 时,响应头中的 Content-Type 将被设置为 application/json,并且这一信息也会被记录在自动生成的 OpenAPI 文档中。

需要注意的是,ORJSONResponse 仅在 FastAPI 中可用,其底层的 Starlette 框架并不支持这一响应类型。此外,ORJSONResponse 是一个较新的功能,可能在某些旧版本的 FastAPI 中不可用。

当然,以下是修改后的示例,包括了如何使用 ORJSONResponse 并展示了预期的输出。

示例 1:基础使用

这个示例展示了如何直接在路由中使用 ORJSONResponse 来返回 JSON 数据。

from fastapi import FastAPI
from fastapi.responses import ORJSONResponse

app = FastAPI()

@app.get("/items/", response_class=ORJSONResponse)
async def read_items():
    return [{"item_id": "Foo"}, {"item_id": "Bar"}]

# 预期输出:
# [
#   {"item_id": "Foo"},
#   {"item_id": "Bar"}
# ]

当客户端访问 /items/ 路径时,将收到一个包含两个项目 ID 的 JSON 响应。

示例 2:结合 Pydantic 模型

这个示例展示了如何结合 Pydantic 模型使用 ORJSONResponse,以确保响应数据的类型验证和文档生成。

from fastapi import FastAPI
from fastapi.responses import ORJSONResponse
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    item_id: str
    price: float
    tax: float = None

@app.get("/items/", response_class=ORJSONResponse)
async def read_items():
    return Item(item_id="Foo", price=10.5, tax=1.5)

# 预期输出:
# {
#   "item_id": "Foo",
#   "price": 10.5,
#   "tax": 1.5
# }

在这个例子中,Item 是一个 Pydantic 模型,它定义了响应的数据结构。当客户端访问 /items/ 路径时,将收到一个符合 Item 模型的 JSON 响应。

示例 3:自定义响应类

这个示例展示了如何创建一个自定义的响应类,继承自 ORJSONResponse,并使用 orjson 的特定选项来格式化 JSON 输出。

from fastapi import FastAPI, Response
from fastapi.responses import ORJSONResponse
import orjson

app = FastAPI()

class CustomORJSONResponse(ORJSONResponse):
    media_type = "application/json"

    def render(self, content: Any) -> bytes:
        assert orjson is not None, "orjson must be installed"
        return orjson.dumps(content, option=orjson.OPT_INDENT_2)

@app.get("/items/", response_class=CustomORJSONResponse)
async def read_items():
    return [{"item_id": "Foo"}, {"item_id": "Bar"}]

# 预期输出:
# [
#   {
#     "item_id": "Foo"
#   },
#   {
#     "item_id": "Bar"
#   }
# ]
# 注意:输出的 JSON 将被格式化,具有缩进和换行符。

在这个例子中,CustomORJSONResponse 类继承自 ORJSONResponse 并重写了 render 方法,使用 orjsonOPT_INDENT_2 选项来美化 JSON 输出。当客户端访问 /items/ 路径时,将收到一个格式化的 JSON 响应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2135136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打造民国风格炫酷个人网页:用HTML和CSS3传递民国风韵

附源码!!! 感谢支持 小弟不断创作网站demo感兴趣的可以关注支持一下 对了 俺在结尾带上了自己用的 背景 大家可以尝试换一下效果更好哦~~~ 如何创建一个民国风格的炫酷网页 在这篇博客中,我们将展示如何制作一个结合民国风格和…

【Java文件操作】文件系统操作文件内容操作

文件系统操作 常见API 在Java中,File类是用于文件和目录路径名的抽象表示。以下是一些常见的方法: 构造方法: File(String pathname):根据给定的路径创建一个File对象。File(String parent, String child):根据父路径…

CANFD接口卡配套奇瑞上位机检测电池状态

随着汽车电子的高速发展,车内信息的急剧增多,传统的CAN总线的数据传输能力已经很难满足车辆ECU的数据传输需求了,此时CANFD就应运而生了。 CANFD和CAN最主要的区别就是CANFD的ID段和数据段能够以不同的速率传输数据,这就保证了即…

下一代 AI 医疗:知识图谱RAG + 多智能体,听医生的话没前途,让医生听你的话才是正道!

下一代 AI 医疗:知识图谱RAG 多智能体,听医生的话没前途,让医生听你的话才是正道! 医疗算法趋势现代 AI 医疗算法问题医学影像算法的局限医疗知识图谱的问题基于最本质循证医学实现人类级因果推理摆脱LLM概率性输出 嘘&#xff0…

用python操作Excel表格(自动化办公)!

文章开始前打个小广告——分享一份Python学习大礼包(激活码安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程)点击领取,100%免费! 一、openpyxl介绍安装 1.…

影刀RPA:考勤自动打卡小程序

上班族,最惊心动魄的一件事,是什么,当然是:打卡 即使你在智能手机上设置提醒,比如闹钟或者日历事件,提醒自己按时打卡,但依然会忘记 即使公司很开明,使用的考勤系统支持可以设置自…

五大注入攻击网络安全类型介绍

1. SQL注入(SQL Injection) SQL注入流程 1.1. 概述 SQL注入是最常见的注入攻击类型之一,攻击者通过在输入字段中插入恶意的SQL代码来改变原本的SQL逻辑或执行额外的SQL语句,来操控数据库执行未授权的操作(如拖库、获取…

不可思议!这7个反共识设计原则,正悄然改变AI应用的未来格局!

引言 在AI技术日益成熟的今天,如何设计出既符合用户需求又具备高度智能化的原生应用,成为摆在开发者面前的重要课题。然而,传统的应用设计思维往往限制了AI潜力的充分发挥。本文提出的七个反共识观点,旨在挑战传统观念&#xff0…

如何优雅的使用 Nacos

简介 问题描述:Nacos 在某一版本后,Spring 官方不再对 Nacos 作版本适配,导致在使用配置中心时,无法导入配置 如何解决:使用 https://start.aliyun.com/ 问题复现 如何解决 新建模块时将服务器 URL 修改为 https://…

UE4_后期处理六—复古电视效果

效果图: 步骤: 1、让场景颜色与复古色相混合,采用强光混合模式,蓝图连接如下图: 效果图如下: 2、把上一章的扫描线效果拿过来,看看扫描线的蓝图节点: 效果图如下: 此效果…

数据为翼,智控未来:EasyCVR视频监控汇聚平台助力城市精准管理

在数字化浪潮席卷全球的今天,智慧城市的概念已不再遥不可及,而是逐步成为现代城市发展的核心驱动力。作为智慧城市的重要组成部分,视频监控系统正以前所未有的速度和规模覆盖城市的每一个角落,成为城市管理者手中的“千里眼”和“…

SOLIDWORKS链阵列功能详解—快速设计链条

在工业产品的设计中,链传动是一种广泛应用的技术,无论是在传送带还是自行车上都能见到它的身影。作为工程师,在进行SOLIDWORKS设计时需要关注产品的整体结构,检查机构运动的合理性,考虑生产成本。 那么如何实现链条的…

学习使用LangGraph x GPT-Researcher构建一个多智能体架构的AI自主研究助理

原文:学习使用LangGraph x GPT-Researcher构建一个多智能体架构的AI自主研究助理 - 百度智能云千帆社区 本文为大家剖析一个通过多智能体协作来完成的AI研究助理,可以用来帮助进行各种综合的在线研究任务并输出报告。该应用基于LangGraph以及开源的GPT-…

【吊打面试官系列-Redis面试题】如果有大量的 key 需要设置同一时间过期,一般需要注意什么?

大家好,我是锋哥。今天分享关于【如果有大量的 key 需要设置同一时间过期,一般需要注意什么?】面试题,希望对大家有帮助; 如果有大量的 key 需要设置同一时间过期,一般需要注意什么? 如果大量的…

19. 删除链表的倒数第 N 个结点【 力扣(LeetCode) 】

零、LeetCode 原题 19. 删除链表的倒数第 N 个结点 一、题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 进阶:你能尝试使用一趟扫描实现吗? 二、测试用例 示例 1: 输入:hea…

【数据结构与算法 | 灵神题单 | 分治(链表)篇】力扣148

1. 力扣148:排序链表 1.1 题目: 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4…

【C++算法】二分查找

二分查找 题目链接 二分查找https://leetcode.cn/problems/binary-search/ 算法原理 代码步骤 代码展示 class Solution { public:int search(vector<int>& nums, int target) {int left 0, right nums.size() - 1;while(left < right){// 防止溢出int mid …

AI周报(9.8-9.14)

AI应用-NEKO Health用AI颠覆体检 Neko Health 由 Spotify 创始人丹尼尔埃克和哈亚尔马尔尼尔森共同创立&#xff0c;致力于通过每年的全身扫描和由 AI 驱动的洞察力来改善预防性医疗保健&#xff0c;能够检测诸如心脏病和皮肤癌等疾病。 该公司通过使用人工智能软件支持的全身…

Docker:对已有的容器,对当前容器映射的端口实时 (增删改查)

首先我的docker已经起了一个容器&#xff0c;我突然想把他的80->80映射的端口改成80->8080 但是我不想去新启动容器&#xff0c;想在现有容器基础上去修改&#xff0c;或者我想删除某个端口映射&#xff08;只是大概思路&#xff09; 如何寻找容器配置文件位置 首先我这…

【运维平台】WGCLOUD是如何判定主机下线的

只要被控主机的agent超过5分钟没有上报监测数据&#xff0c;系统就会判定该主机下线 这里的5分钟是默认的判定时间&#xff0c;如果agent上报时间是1分钟&#xff0c;那么agent超过1分钟没有上报数据&#xff0c;就会判定下线