10。FastAPI响应体
10.FastAPI响应体
FastAPI支持声明响应体模型进行响应数据的处理。 可以在任意路由操作中使用 response_model 参数来声明用于响应的模型: @app.get() @app.post() @app.put() @app.delete() 等等。
response_model是装饰器方法(get,post 等)的一个参数,而不是路由操作函数的参数;其类型与 Pydantic 模型属性所声明的类型相同,因此它可以是一个 Pydantic 模型,但也可以是一个由 Pydantic 模型组成的 list,例如 List[Item]。
在FastAPI 中,使用 response_model 的作用: 将输出数据转换为其声明的类型。 校验数据。 在 OpenAPI 的路径操作中为响应添加一个 JSON Schema。 并在自动生成文档系统中使用。 会将输出数据限制在该模型定义内。 10.1响应模型
代码示例: from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class UsrIn(BaseModel): name: str sex: str acc: str pwd: str class UsrOut(BaseModel): name: str sex: str acc: str @app.post(path="/add_a_usr", response_model=UsrOut) async def add_a_usr(usr: UsrIn): return usr
在上面的代码中,输入模型为UsrIn,输出模型为UsrOut,通过输出模型来屏蔽pwd字段的输出。执行请求: curl -H "Content-Type: application/json;" -X POST -d "{"name":"zhaomm","sex":"woman","acc":"zhaomm","pwd":"Zhao68641018"}" http://127.0.0.1:8000/add_a_usr { "name":"zhaomm", "sex":"woman", "acc":"zhaomm" }10.2响应模型默认值
在FastAPI中,响应模型也可以具有默认值。
代码示例: from fastapi import FastAPI from fastapi import Body from typing import Optional from typing import List from pydantic import BaseModel app = FastAPI() class ProductOut(BaseModel): id: str = Body(...) name: str = Body(...) price: Optional[float] = Body(10.0) desc: Optional[str] = Body(None) @app.get(path="/find_products", response_model=List[ProductOut]) async def find_products(): products = [ {"id": "p1", "name": "玫瑰花"}, {"id": "p2", "name": "百合花", "price": 12.8}, {"id": "p3", "name": "月季花", "price": 19.8, "desc": "月季花"} ] return products
执行请求: curl http://127.0.0.1:8000/find_products [ { "id":"p1", "name":"玫瑰花", "price":10.0, "desc":null },{ "id":"p2", "name":"百合花", "price":12.8, "desc":null },{ "id":"p3", "name":"月季花", "price":19.8, "desc":"月季花" } ]
从上面的代码执行结果可以看出:当在实际输出中没有定义对应的字段属性值时,使用响应模型的默认值输出。如果希望响应结果中不输出默认值,仅输出实际数据,则可以在 可以设置路由操作装饰器的 response_model_exclude_unset 参数为真,下面代码在路由中增加该参数,代码如下: from fastapi import FastAPI from fastapi import Body from typing import Optional from typing import List from pydantic import BaseModel app = FastAPI() class ProductOut(BaseModel): id: str = Body(...) name: str = Body(...) price: Optional[float] = Body(10.0) desc: Optional[str] = Body(None) @app.get(path="/find_products", response_model=List[ProductOut], response_model_exclude_unset=True) async def find_products(): products = [ {"id": "p1", "name": "玫瑰花"}, {"id": "p2", "name": "百合花", "price": 12.8}, {"id": "p3", "name": "月季花", "price": 19.8, "desc": "月季花"} ] return products
执行请求: curl http://127.0.0.1:8000/find_products [ { "id":"p1", "name":"玫瑰花" },{ "id":"p2", "name":"百合花", "price":12.8 },{ "id":"p3", "name":"月季花", "price":19.8, "desc":"月季花" } ]
在以上情况下,如果实际数据值与默认值相同,那么FastAPI仍然会输出,也就是说,当设置response_model_exclude_unset=True时,其输出是按照实际值输出的。下面将代码{"id": "p2", "name": "百合花", "price": 12.8}中的price字段值修改为10.0,然后执行请求: curl http://127.0.0.1:8000/find_products [ { "id":"p1", "name":"玫瑰花" },{ "id":"p2", "name":"百合花", "price":10.0 },{ "id":"p3", "name":"月季花", "price":19.8, "desc":"月季花" } ]
从上面的执行结果可以看出:虽然实际数据值与默认值相同,但仍然会输出。如果此时,不希望输出与默认值相同的数据值,可以设置 response_model_exclude_defaults参数为True,代码片段如下: class ProductOut(BaseModel): id: str = Body(...) name: str = Body(...) price: Optional[float] = Body(10.0) desc: Optional[str] = Body(None) @app.get(path="/find_products", response_model=List[ProductOut], response_model_exclude_defaults=True) async def find_products(): products = [ {"id": "p1", "name": "玫瑰花"}, {"id": "p2", "name": "百合花", "price": 10.0}, {"id": "p3", "name": "月季花", "price": 19.8, "desc": "月季花"} ] return products
执行请求: curl http://127.0.0.1:8000/find_products [ { "id":"p1", "name":"玫瑰花" },{ "id":"p2", "name":"百合花" },{ "id":"p3", "name":"月季花", "price":19.8, "desc":"月季花" } ]
在上面的执行结果中:{"id":"p2","name":"百合花"}没有输出price字段的实际数据值,因为与默认值相同。
另外还有一个装饰器参数: response_model_exclude_none,如果设置该参数为True,则表示在响应模型中不输出None值。代码片段如下: @app.get(path="/find_products", response_model=List[ProductOut], response_model_exclude_none=True) async def find_products(): products = [ {"id": "p1", "name": "玫瑰花"}, {"id": "p2", "name": "百合花", "price": 10.0}, {"id": "p3", "name": "月季花", "price": 19.8, "desc": "月季花"} ] return products
执行请求: curl http://127.0.0.1:8000/find_products [ { "id":"p1", "name":"玫瑰花", "price":10.0 },{ "id":"p2", "name":"百合花", "price":10.0 },{ "id":"p3", "name":"月季花", "price":19.8, "desc":"月季花" } ] 10.3显式声明响应模型的字段
可以使用装饰器参数response_model_include 和 response_model_exclude来显式指明包含或者排除的字段,这两个参数接受由字符串组成的set类型,也可以使用list或tuple,但使用list或tuple最终会转换为set类型。
在Python中,set类型使用一组花括号定义,如:{"sex", "name"}。
代码示例: @app.get(path="/find_products", response_model=List[ProductOut], response_model_include={"price", "desc"}) async def find_products(): products = [ {"id": "p1", "name": "玫瑰花"}, {"id": "p2", "name": "百合花", "price": 10.0}, {"id": "p3", "name": "月季花", "price": 19.8, "desc": "月季花"} ] return products
执行请求: curl http://127.0.0.1:8000/find_products [ { "price":10.0, "desc":null },{ "price":10.0, "desc":null },{ "price":19.8, "desc":"月季花" } ] 10.4响应模型Union
在FastAPI中,响应模型可以设置为多个类型的Union,响应为多种类型中的一种;定义该类型使用标准的Python类型提示typing.Union,原则上应该是先使用详细的类型,然后使用粗略的类型。代码示例: from typing import Union from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class BaseItem(BaseModel): description: str type: str class CarItem(BaseItem): type = "car" length: int class PlaneItem(BaseItem): type = "plane" size: int items = { "item1": {"description": "All my friends drive a low rider", "type": "car", "length": 200}, "item2": { "description": "Music is my aeroplane, it"s my aeroplane", "type": "plane", "size": 5, }, } @app.get("/items/{item_id}", response_model=Union[PlaneItem, CarItem]) async def read_item(item_id: str): return items[item_id]
执行请求: curl http://127.0.0.1:8000/items/item1 { "description":"All my friends drive a low rider", "type":"car", "length":200 } C:UsersAdministrator>curl http://127.0.0.1:8000/items/item2 { "description":"Music is my aeroplane, it"s my aeroplane", "type":"plane", "size":5 } 10.5任意 dict 构成的响应
在FastAPI中,如果事先不确定返回值的键名称,但可以确定返回的数据类型,那么,可以使用只包含类型的dict作为响应模型,使用 typing.Dict。示例代码如下: from fastapi import FastAPI from typing import Dict app = FastAPI() @app.get(path="/test", response_model=Dict[str, int]) async def test(): return {"foo": 20}
执行请求: curl http://127.0.0.1:8000/test {"foo":20}
外呼系统哪家公司做得好,电销外呼防封号软件外呼系统哪家公司做得好,电销外呼防封号软件在这个电销盛行的时代,科技发展速度无法预估,外呼系统的应用价值也逐级体现,所以当然有比较好用的电话外呼系统,下面就为你们介绍一下智创良品家
axb电销系统容易封号?电销axb软件下载电销axb系统搭建代码技术是一方面,最重要是有外呼线路。解决了线路问题,代码程序如果是自己有能力开发的,可以自己写。如果没这方面的技术人才,也可以购买他人的源码,根据自己的要求定制
网络电话呼叫软件免费版,外呼app网络电话呼叫软件免费版,外呼app免费客户呼叫中心管理软件是一款易用实用的电话营销,电话销售,电话录音,客户微信管理软件,是智创良品公司针对大量电销人员封号问题推出来的,电销来电规
宋PLUS新能源售14。68万元起欢迎试驾驭见皆引领!全球首款宽体超混SUV领航上市!宋PLUSDMi上市价14。68万起(综合补贴后)创新采用骁云插混专用1。5L高效发动机高效EHS电混系统,达到短途用电经济节省,长途用
宋PLUS新能源售14。68万元起欢迎试驾驭见皆引领!全球首款宽体超混SUV领航上市!宋PLUSDMi上市价14。68万起(综合补贴后)创新采用骁云插混专用1。5L高效发动机高效EHS电混系统,达到短途用电经济节省,长途用
海豚售价9。38万元起欢迎莅临赏鉴纯电新物种海豚正式上市!综合补贴后售价9。38万元12。18万元!海豚是海洋车系的首款车型,也是首款采用海洋美学设计理念的车型,首款基于e平台3。0打造的车型。搭载DiLink3。
宋PLUSDMiAWD正式上市,售19。98万元驭见皆引领!全球首款宽体超混SUV领航上市!宋PLUSDMi上市价14。68万起(综合补贴后)创新采用骁云插混专用1。5L高效发动机高效EHS电混系统,达到短途用电经济节省,长途用
锐明技术国内车载视频监控龙头,智慧交通趋势下增长形势明朗选股理由次新股营收与净利润增长证券代码002970评级A本文分为六部分一主营业务二公司治理三财务分析四核心竞争力及投资逻辑五盈利预测及估值六投资观点数据截止日期2020年3月31日
短视频的本质是用户赋能平台2016年以来,短视频进入爆发期,字节跳动和快手得益于短视频红利而迅速壮大。近来,腾讯系秒拍和微博又加大在短视频领域的布局,一时之间,短视频市场战端又起,至于谁能笑到最后,仁者见仁
短视频如何变现?移动互联时代的到来,释放了巨大的用户红利,数以亿计的用户成为移动互联用户,在此基础上短视频市场爆发式增长,尤其值得一提的是,经过一段时间的探索实践,短视频的商业变现模式基本成熟,具
短视频能否使优秀传统文化更美好?十九大报告指出,中国特色社会主义进入新时代,我国社会主要矛盾已经转化为人民日益增长的美好生活需要和不平衡不充分的发展之间的矛盾。而借助互联网新渠道新形式来实现传统优秀文化的创造性转