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)

正常传参的请求结果

FastAPI(46)- JSONResponse

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&#xA0;</class>
  • 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)&#xA0;

console 打印结果

{'id': 'string', 'name': 'string', 'title': 'string'} <class 'dict'>
INFO:     127.0.0.1:52880 - "POST /item2 HTTP/1.1" 200 OK</class>

假设将 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 is not JSON serializable
  • 类型错误:项目类型的对象不是 JSON 可序列化的
  • 因为它无法转换为 JSON 数据,所以报错了

看看 JSONResponse 源码

FastAPI(46)- JSONResponse

会调用 json.dumps() 方法

看看 Response 源码

FastAPI(46)- JSONResponse

看到其实可以自定义 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)

正确传参的请求结果

FastAPI(46)- JSONResponse

更多自定义响应类型

Original: https://blog.csdn.net/qq_33801641/article/details/120600646
Author: 小菠萝测试笔记
Title: FastAPI(46)- JSONResponse

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/735028/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Scrapy教程 – (2)寫一個簡單爬蟲

    Scrapy教程 – (2)寫一個簡單爬蟲 目的:爬取此網頁的所有書籍名稱,價格,url,庫存,評價及封面圖片。本文以此網站為例 檢查robotstxt_obey 創建…

    Python 2023年10月2日
    051
  • python饼状图顺时针_Python matplotlib顺时针饼图

    我正在研究Python及其matplotlib库,如何创建以下图表,以便第一个切片从顶部开始并向右(顺时针)而不是向左(逆时针)移动: 代码:import matplotlib.p…

    Python 2023年9月6日
    044
  • python小球弹跳_python实现小球弹跳效果

    本文实例为大家分享了python实现小球弹跳效果的具体代码,供大家参考,具体内容如下 import pygame, sys pygame.init() screengamecapt…

    Python 2023年9月21日
    052
  • CentOS搭建Django项目环境:nginx+django+supervisor+Anaconda+mysql

    本项目所用的远程链接工具为electerm(开源且跨平台(macOS,linux,windows),同时支持ssh和sftp,支持保存多个命令,唯一的遗憾新版本不支持串口)http…

    Python 2023年8月6日
    057
  • 【网络安全】记一次APP登录爆破

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年10月8日
    044
  • filebeat

    filebeat 时go语言编写更轻量,建议和elk 其他组件版本保持一致 cat filebeat.yml filebeat.inputs: – type: log enable…

    Python 2023年6月6日
    069
  • 使用python制作查询火车票工具

    使用python脚本实现查询火车票信息的效果图如下: 实现的代码: 1 # coding: utf-8 2 3 “””命令行火车票查看器 4 5…

    Python 2023年9月20日
    038
  • pytest基础学习第一课

    pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1、简单灵活,容易上手,文档丰富; 注:看到下面实例确实容易上手,简单灵活和文档丰富目前还未能体会 …

    Python 2023年9月9日
    030
  • 机器人十大前沿热点领域(2022-2023)

    中国电子学会嵌入式系统与机器人分会主任委员、北京航空航天大学机器人研究所名誉所长、中关村智友研究院院长王田苗博士出席大会闭幕式,并现场发布《机器人十大前沿热点领域(2022-202…

    Python 2023年9月27日
    046
  • 014_SSS_High-Resolution Image Synthesis with Latent Diffusion Models

    High-Resolution Image Synthesis with Latent Diffusion Models 1. Introduction 本文提出了在隐空间应用di…

    Python 2023年10月10日
    031
  • pygame之rect对象

    Rect对象 从本质来看rect对象是一个看不见的矩形区域 Rect对象的创建 主动创建 pygame.Rect(left,top,width,height) 注:left和top…

    Python 2023年9月22日
    045
  • ChatGPT写的一篇数字化转型文章

    文末附ChatGPT调戏链接,无需注册登录直接使用。 数字化转型是指企业利用数字技术来改善业务流程、增强竞争力和降低成本。它旨在帮助企业更快、更有效地实现业务发展和创新,并为客户提…

    Python 2023年11月4日
    034
  • 3.MNIST数据集分类

    文章 * – 一、MNIST数据集及Softmax – + 1.MNIST数据集 + 2.Softmax – 二、MNIST数据集分类 &#82…

    Python 2023年10月10日
    041
  • 控制Python浮点数输出位数

    在Python的一些长效任务中,不可避免的需要向文本文件、二进制文件或者数据库中写入一些数据,或者是在屏幕上输出一些文本,此时如何控制输出数据的长度是需要我们注意的一个问题。比如对…

    Python 2023年5月24日
    089
  • 【22年9月19日】基于Python+Flask+爬虫的新冠疫情实时监测可视化系统设计与实现(爬虫、后台管理、前台可视化)

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年8月10日
    039
  • 操作系统的介绍

    操作系统的介绍 1.什么是操作系统 操作系统实际上是一个协调、管理和控制计算机硬件和软件资源的控制程序。 [En] The operating system is actually…

    Python 2023年5月23日
    049
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球