FastAPI(46)- JSONResponse

简介: FastAPI(46)- JSONResponse

背景


  • 创建 FastAPI 路径操作函数时,通常可以从中返回任何数据:字典、列表、Pydantic 模型、数据库模型等
  • 默认情况下,FastAPI 会使用 jsonable_encoder 自动将该返回值转换为 JSON 字符串
  • 然后,FastAPI 会将与 JSON 兼容的数据(例如 dict)放在 JSONResponse 中,然后将 JSONResponse 返回给客户端
  • 总结:默认情况下,FastAPI 将使用 JSONResponse 返回响应
  • 但是可以直接从路径操作函数中返回自定义的 JSONResponse

 

返回响应数据的常见方式(基础版)

https://www.cnblogs.com/poloyy/p/15364635.html

 

最简单的栗子


路径操作函数返回一个 Pydantic Model

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/10/3 3:26 下午
# file: 38_responses.py
"""
from typing import Optional
import uvicorn
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
    id: str
    name: str
    title: Optional[str] = None
@app.post("/item")
async def get_item(item: Item):
    # 打印看看传进来的数据是什么
    print(item, type(item))
    # 直接返回传进来的数据
    return item
if __name__ == '__main__':
    uvicorn.run(app="38_responses:app", reload=True, host="127.0.0.1", port=8080)


正常传参的请求结果

image.png

Response Header 的显示 content-type 是 JSON

 

console 打印结果

id='string' name='string' title='string' <class'38_responses.Item'>

INFO:     127.0.0.1:51856 - "POST /item HTTP/1.1" 200 OK

  • item 类型的确是 Pydantic Model 类
  • 但最终返回给客户端的是一个 JSON 数据

 

等价写法

@app.post("/item")

async def get_item(item: Item):

   return item

这样写也能返回 JSON 数据,是因为FastAPI 是自动帮忙做了转换的

等价写法如下

from fastapi.encoders import jsonable_encoder


@app.post("/item")

async def get_item(item: Item):

   json_body = jsonable_encoder(item)

   return JSONResponse(content=json_body)

 

打印数据,来看看细节

@app.post("/item2")
async def get_item(item: Item):
    json_body = jsonable_encoder(item)
    print(json_body, type(json_body))
    return JSONResponse(content=json_body) 


console 打印结果

{'id': 'string', 'name': 'string', 'title': 'string'} <class'dict'>

INFO:     127.0.0.1:52880 - "POST /item2 HTTP/1.1" 200 OK

 

假设将 item Pydantic Model 类型直接传给 JSONResponse 呢?

@app.post("/item3")

async def get_item(item: Item):

   return JSONResponse(content=item)

 

访问该接口就会报错

raise TypeError(f'Object of type {o.__class__.__name__} '

TypeError: Object of type Item isnot JSON serializable

  • 类型错误:项目类型的对象不是 JSON 可序列化的
  • 因为它无法转换为 JSON 数据,所以报错了

 

看看 JSONResponse 源码


image.png

会调用 json.dumps() 方法

 

看看 Response 源码


image.png

看到其实可以自定义 status_code、headers、media_type 哦

headers 后面再用单独的篇幅来讲

 

修改 status_code 响应码


@app.post("/item2")

async def get_item(item: Item):

   json_item = jsonable_encoder(item)

   return JSONResponse(content=json_item, status_code=status.HTTP_201_CREATED)

 

正确传参的请求结果

image.png


更多自定义响应类型


 

相关文章
|
机器学习/深度学习
阿里Animate Anyone:让任何静态图像动起来
【2月更文挑战第17天】阿里Animate Anyone:让任何静态图像动起来
1033 3
阿里Animate Anyone:让任何静态图像动起来
|
SQL 关系型数据库 MySQL
Python 数据库访问与ORM框架——打造高效开发利器
Python 作为一门广泛使用的编程语言,其在数据库访问方面也有着较为成熟的解决方案,其中ORM框架更是成为了开发者们的首选。本文将介绍 Python 中数据库访问和 ORM 框架的基本概念,以及如何使用 SQLAlchemy 这一优秀的 ORM 框架进行开发。
|
2月前
|
存储 人工智能 搜索推荐
Tablestore OpenMemory MCP : 跨会话、跨模型的智能记忆解决方案
本文介绍了Mem0的原理与应用场景,并基于Mem0构建了Tablestore OpenMemory MCP服务,实现个性化旅行规划助理。Mem0是一种为大型语言模型设计的智能记忆层,通过向量数据库持续学习用户交互信息,实现跨会话的个性化记忆管理。该服务提供多种MCP工具,便于集成到各类AI应用中。最后演示了个性化旅行规划应用,并介绍了服务的运行与配置方式。
274 0
小知识 .rp文件用什么打开
rp 文件可以通过 Axure8 导入打开,具体方式如下:
4579 0
小知识 .rp文件用什么打开
|
5月前
|
存储 人工智能 监控
通过Milvus和Langchain快速构建基于百炼大模型的LLM问答系统
阿里云向量检索服务Milvus版是一款全托管向量检索引擎,并确保与开源Milvus的完全兼容性,支持无缝迁移。它在开源版本的基础上增强了可扩展性,能提供大规模AI向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力和全链路监控告警,Milvus云服务成为多样化AI应用场景的理想选择,包括多模态搜索、检索增强生成(RAG)、搜索推荐、内容风险识别等。您还可以利用开源的Attu工具进行可视化操作,进一步促进应用的快速开发和部署。
|
8月前
|
弹性计算 运维 监控
OS Copilot-操作系统智能助手测试报告-新人体验
测试体验OS copilo安装、启动,体验copilot的提供的`-t`、`-f`、`|`通道的指令在在精准分析、批量任务处理、文件分析的能力。并记录下来。
267 18
|
Java Spring
Eureka:com.netflix.discovery.TimedSupervisorTask - task supervisor timed out
Eureka:com.netflix.discovery.TimedSupervisorTask - task supervisor timed out
1671 0
|
11月前
|
移动开发 前端开发 JavaScript
2024年前端框架趋势概览
【10月更文挑战第2天】本文综合了多个来源的信息,以提供一个全面的2024年前端框架趋势概览。希望通过本文,读者能够把握前端开发的最新动态,并在自己的项目中应用这些趋势。
|
12月前
|
Web App开发 数据采集 JavaScript
有JavaScript动态加载的内容如何抓取
有JavaScript动态加载的内容如何抓取
|
监控 Linux
Linux 运行进程实时监控pidstat命令详解
Linux 运行进程实时监控pidstat命令详解
262 0