
# 路径操作
@app.post("/items/", response_model=Item)
# 路径函数
async def create_item(item: Item):
...response_model 是路径操作的参数,并不是路径函数的参数哦
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog: https://www.cnblogs.com/poloyy/
# time: 2021/9/21 5:12 下午
# file: 17_response_model.py
"""
from typing import List, Optional
import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
tags: List[str] = []
@app.post("/items/", response_model=Item)
async def create_item(item: Item):
return item
if __name__ == "__main__":
uvicorn.run(app="16_Header:app", host="127.0.0.1", port=8080, reload=True, debug=True) 上面代码栗子,请求模型和响应模型都是同一个 Pydantic Model


from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
app = FastAPI()
class UserIn(BaseModel):
username: str
password: str
email: EmailStr
full_name: Optional[str] = None
class UserOut(BaseModel):
username: str
email: EmailStr
full_name: Optional[str] = None
@app.post("/user/", response_model=UserOut)
async def create_user(user: UserIn):
return user


response_model_exclude_unset=True
class Item(BaseModel):
name: str
price: float
# 下面三个字段有默认值
description: Optional[str] = None
tax: float = 10.5
tags: List[str] = []
items = {
"foo": {"name": "Foo", "price": 50.2},
"bar": {"name": "Bar", "description": "The bartenders", "price": 62, "tax": 20.2},
"baz": {"name": "Baz", "description": None, "price": 50.2, "tax": 10.5, "tags": []},
}
@app.get("/items/{item_id}", response_model=Item, response_model_exclude_unset=True)
async def read_item(item_id: str):
# 从上面 items 字典中,根据 item_id 取出对应的值并返回
return items[item_id]
不会返回有默认值的字段

只返回了设置值的字段

Optional[Union[SetIntStr, DictIntStrAny]]
查看源码可以看到
# set 类型,子元素类型可以是 int、str
SetIntStr = Set[Union[int, str]]
# dict 类型,键类型可以是 int、str,值类型可以是任意类型
DictIntStrAny = Dict[Union[int, str], Any]结合上面注册功能的栗子:请求要密码,响应不要密码
class User(BaseModel):
username: str
password: str
email: EmailStr
full_name: Optional[str] = None
@app.post("/user/", response_model=User, response_model_include={"username", "email", "full_name"})
async def create_user(user: User):
return user

passwor 仍然存在,这明显不是我们想要的最佳效果,所以还是推荐用多个类的思想
class User(BaseModel):
username: str
password: str
email: EmailStr
full_name: Optional[str] = None
@app.post("/user/", response_model=User, response_model_exclude={"password"})
async def create_user(user: User):
return user同 include
同 include