python编程 30秒高级私人定制 Response对象
点击python编程从入门到实践,置顶 公众号重磅 python入门资料,第一时间送达
haishiniu
读完需要
9
分钟速读仅需 3 分钟
/ python 编程 30 秒高级私人定制 Response 对象,十倍扩展效率 /
注:这篇文章很长,但我保证你看完后能进行高度自定义 Response 提神开发效率。
在 fastapi 路径操作中,通常直接返回以下数据类型:dict,list,Pydantic 模型,数据库模型以及其他数据类型。fastapi 通过 jsonable_encoder 函数自动把返回数据转换为 JSON 格式,然后把 JSON 兼容的数据内容传送给 JSONResponse 对象并返回给终端用户。
但在某些情况下,我们需要在路径操作中直接返回 Response 对象,这样我们能有更多的操作灵活性,比如我们上节讲的自定义 Cookie 信息,自定义头信息。
1
Response 模型
Response 主类,所有其他的 Response 都继承自这个类。
它接收以下参数信息:
content - str 或者 bytes
status_code - HTTP 状态码
headers - 字符串字典
media_type - media type. 例如"text/html"
fastapi 会自动包含 Content-Length,以及 Content-Type,charset 等头信息。
1.1
返回 Response
我们可以直接返回 Response 或者它的任何子类。JSONResponse 实际上也是 Response 的子类。这个时候 fastapi 不会做任何数据转换和数据校验,而是直接返回数据。若我们想具有很大的灵活性,可以返回任何数据类型,重写数据声明或者数据校验。则可以利用 jsonable_encoder 把数据转换成 JSON 兼容格式。
# -*- encoding: utf-8 -*-
from datetime import datetime
from typing import Optional
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
from pydantic import BaseModel
class Item(BaseModel):
title: str
name: str
description: Optional[str] = None
app = FastAPI()
@app.get("/info")
def get_item(item: Item):
json_compatible_item_data = jsonable_encoder(item)
return JSONResponse(content=json_compatible_item_data)
1.2
返回自定义 Response
我们也是可以返回自定义的 Response
# -*- encoding: utf-8 -*-
from fastapi import FastAPI, Response
app = FastAPI()
@app.get("/get_json_info")
def get_json_data():
data = {
"name": "haishiniu",
"address": "beijing"
}
return Response(content=data, media_type="application/json")
2
高级自定义 Response
我们也可以更灵活的定制返回结果用于满足我们的日常开发工作。
2.1
参数 responses
我们可以传递给路径操作装饰器一个参数 responses,他接收一个字典数据,键值是不同的 HTTP 状态码,内容是不同情况下的返回内容(字典格式)。如果返回内容包含键值 model,那么它的作用与 response_model 相同,指向的内容是 Pydantic 模型。如下示例,当返回状态码是 404 的时候,对应的 Pydantic 模型是 Message :
# -*- encoding: utf-8 -*-
from fastapi import FastAPI
from fastapi.responses import JSONResponse
from pydantic import BaseModel
class Item(BaseModel):
id: str
value: str
class Message(BaseModel):
message: str
app = FastAPI()
@app.get("/get_info/{item_id}", response_model=Item, responses={404: {"model": Message}})
async def read_item(item_id: str):
if item_id == "666":
return {"id": "666", "value": "good job ! find haishiniu "}
else:
return JSONResponse(status_code=404, content={"message": "not good ! you are not find me"})
分析上面的示例,在正常情况下返回的数据模型是 Item,404 的时候返回的数据模型是 Message。
2.2
不同的 media type
参数 responses 也支持不同的 media type。
# -*- encoding: utf-8 -*-
from typing import Optional
from fastapi import FastAPI
from fastapi.responses import FileResponse
from pydantic import BaseModel
class Item(BaseModel):
id: str
value: str
app = FastAPI()
@app.get(
"/get_info/{item_id}",
response_model=Item,
responses={
200: {
"content": {"image/png": {}},
"description": "Return the JSON item or an image.",
}
},
)
async def read_item(item_id: str, img: Optional[bool] = None):
if img:
return FileResponse("image.png", media_type="image/png")
else:
return {"id": "888", "value": "not good to find value image/png"}
如上所示,默认的 media type 是 application/json,同时还支持 image/png。
2.3
预定义 responses 与自定义 responses 并行
本小节我们是我们自定义的加强版本,可进行任意的扩展
from typing import Optional
from fastapi import FastAPI
from fastapi.responses import FileResponse
from pydantic import BaseModel
class Item(BaseModel):
id: str
value: str
responses = {
404: {"description": "Item not found"},
302: {"description": "The item was moved"},
403: {"description": "Not enough privileges"},
}
app = FastAPI()
@app.get(
"/get_info/{item_id}",
response_model=Item,
responses={**responses, 200: {"content": {"image/png": {}}}},
)
async def read_item(item_id: str, img: Optional[bool] = None):
if img:
return FileResponse("image.png", media_type="image/png")
else:
return {"id": "foo", "value": "not good to find value image/png"}
3
总结
1.介绍了 fastapi 中 Response 模型
2.讲解了如何去自定义 Response,读者可根据自己的业务场景进行实践
3.简单介绍了 status_code ,下节在分享 fastapi 异常处理的时候还会再讲解
最近有小伙伴后台留言问有没有面试相关的资料,周末整理了一份面试需要注意的点已做成思维导图,需要的同学请在后台回复「面试」就可以 get 此项技能
往期推荐
大型fastapi项目实战 靠 python 中间件解决方案涨薪了
大型fastapi项目实战 高并发请求神器之aiohttp(下)
大型fastapi项目实战 高并发请求神器之aiohttp(上) [建议收藏]
本文分享自微信公众号 - python编程军火库(PythonCoder1024)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
面向对象编程内功心法系列十一(聊一聊装饰器模式)
1.引子 下午好!今天我要分享给你的是我们面向对象编程内功心法系列的第十一篇文章,在这一篇我们一起来聊一聊装饰器设计模式。 说起装饰器设计模式,你不应该感到陌生。我们日常开发中,经常有网络操作、文件操作方面的需求,比如说读写网络数据包,比如说读写文件。你一定已经想到了,针对刚才提出的需求,jdk给我们提供了丰富的IO工具类库。比如说 字节流:InputStream、OutputStream、BufferedInputStream、BufferedOutputStream 字符流:Reader、Writer、BufferedReader、BufferedWriter 不知你平常是否有阅读源码的习惯,如果我们打开IO类库源码,我们会发现jdk整个IO类库的设计实现,就应用了装饰器设计模式。本次分享文章的最后部分,我将带着你一起来看一看。 2.案例 2.1.什么是装饰器设计模式 根据设计模式的分类,装饰器设计模式属于结构型设计模式,通过组合关系将对象组装在一起,实现组合对象间功能的增强。 看到增强,与结构型设计模式字眼,你是否会想到我们上一篇文章分享的代理设计模式。我们说代理设计模式其中的作...
- 下一篇
如果诸葛亮是程序员,如何用程序写出师表。。
作者: 人人网 来源:blog.renren.com/share/308645063/17257436317 代码如下: 运行结果: 作为一名开发者,它把我惹毛了!! 高级程序员必知的 7 种软件架构模式! 本文分享自微信公众号 - 架构师修行之路(jiagoushixiuxing)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Hadoop3单机部署,实现最简伪集群