背景

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

最简单的栗子

路径操作函数返回一个 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)

正常传参的请求结果

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

看看 JSONResponse 源码

会调用 json.dumps() 方法

看看 Response 源码

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

正确传参的请求结果

最新文章

  1. 告别IT,出售多年自己研发的股票分析系统源码
  2. Jconsole加载Jtop插件
  3. WinForm 批量设置指定控件中的控件状态
  4. iOS 三种录制视频方式
  5. 字符编码:ANSI,ASCII,GB2312,GBK,Big5,Unicode和UTF-8
  6. python基础知识一
  7. 1.3. chromium源代码分析 - chromiumframe - 窗口系列
  8. Mongo汇总问题
  9. 转:【Java并发编程】之九:死锁(含代码)
  10. dedecms安装操作-重安装-开启GD库
  11. 通俗讲解 异步,非阻塞和 IO 复用
  12. [administrative][qemu][kvm] qemu使用--bridge-helper
  13. linux高级编程——IO
  14. 20170617xlVBA调查问卷基础数据分类计数
  15. Django QueryDict
  16. cin 不能直接读入空格,可以用getline(PAT统计字符数)
  17. IOC容器之Autofac
  18. [ZJOI2019]Minimax搜索
  19. SpringMVC接收前端传值有哪些方式?
  20. 一:HTML文本编译器 kindeditor-4.1.10 的使用 SpringMVC+jsp的实现

热门文章

  1. 免杀生成器之Charlotte解析
  2. Windows CMD .bat 批处理基础语法
  3. 阿里云(CentOS)搭建MediaWiki
  4. ES6对象扩展——扩展运算符
  5. Learning ROS: rostopic pub yaml demo
  6. uniapp 设置背景图片
  7. ReScript 与 TypeScript,谁是前端圈的“当红辣子鸡”
  8. RHCA-openstack学习部署笔记-CL210
  9. Robot Framework 面试题
  10. SVN无法查看最近日志和提交记录