FastAPI学习笔记(一)-11.响应模型基本使用

 1 '''
 2 @author:invoker
 3 @project:fastapi202108
 4 @file: chapter041.py
 5 @contact:invoker2021@126.com
 6 @descript:
 7 @Date:2021/8/5 21:22
 8 @version: Python 3.7.8
 9 '''
10 
11 from fastapi import APIRouter
12 from pydantic import BaseModel, EmailStr,Field
13 from typing import Optional
14 
15 # 路由对象app04
16 app041 = APIRouter()
17 
18 """
19 响应模型
20 """
21 
22 
23 # 用户基本信息-基本模型体
24 class UserInfo(BaseModel):
25     username: str
26     email: EmailStr
27     mobile: str = "15900000003"
28     address: str = None
29     full_name: Optional[str] = None
30 
31 
32 # 输入用户信息-请求模型体
33 class inputUserModel(UserInfo):
34     password: str
35 
36 
37 # 返回用户信息,响应模型体
38 class returnUserModel(UserInfo):
39     # userId: int=Field(default=1)
40     pass
41 
42 
43 users = {
44     "user01": {"username": "invoker", "email": "invoker2021@126.com"},
45     "user02": {"username": "pudge", "email": "pudge@126.com", "mobile": "15900000002", "address": "夜宴",
46                "full_name": "futu pudge"}
47 }
48 
49 
50 # response_model叫做路径操作(path operation)
51 # response_model_exclude_unset = False 表示返回值设置为空时,返回值会将默认值填充到返回值内。
52 @app041.post('/response_model_1', response_model=returnUserModel, response_model_exclude_unset=False)
53 async def response_model(user: inputUserModel):
54     print(user.password)
55     return users["user01"]
View Code

1.以上代码定义了请求模型 inputUserModel 和 响应模型 returnUserModel 2个类。

请求模型:

# 用户基本信息-基本模型体
class UserInfo(BaseModel):
username: str
email: EmailStr
mobile: str = "15900000003"
address: str = None
full_name: Optional[str] = None


# 输入用户信息-请求模型体
class inputUserModel(UserInfo):
password: str


响应模型:
# 用户基本信息-基本模型体
class UserInfo(BaseModel):
username: str
email: EmailStr
mobile: str = "15900000003"
address: str = None
full_name: Optional[str] = None


# 返回用户信息,响应模型体
class returnUserModel(UserInfo):
# userId: int=Field(default=1)
pass


2.定义了返回值 users

 

3.设置response_model_exclude_unset = False 表示返回值设置为空时,返回值会将默认值填充到返回值内

接口1:/chapter041/response_model_1

返回值:

{ "username": "invoker", "email": "invoker2021@126.com", "mobile": "15900000003", "address": null, "full_name": null }

 

4.response_model_exclude_unset = True 表示返回值如果为空,则返回空,不会将默认值填写返回

接口2:/chapter041/response_model_2

返回值:

{ "username": "invoker", "email": "invoker2021@126.com" }

 

5.合并模型Union

接口3:/chapter041/response_model_3/attributes

 1 '''
 2 @author:invoker
 3 @project:fastapi202108
 4 @file: chapter041.py
 5 @contact:invoker2021@126.com
 6 @descript:
 7 @Date:2021/8/5 21:22
 8 @version: Python 3.7.8
 9 '''
10 
11 from fastapi import APIRouter
12 from pydantic import BaseModel, EmailStr, Field
13 from typing import Optional, Union
14 
15 # 路由对象app04
16 app041 = APIRouter()
17 
18 """
19 响应模型
20 """
21 
22 
23 # 用户基本信息-基本模型体
24 class UserInfo(BaseModel):
25     username: str
26     email: EmailStr
27     mobile: str = "15900000003"
28     address: str = None
29     full_name: Optional[str] = None
30 
31 
32 # 输入用户信息-请求模型体
33 class inputUserModel(UserInfo):
34     password: str
35 
36 
37 # 返回用户信息,响应模型体
38 class returnUserModel(UserInfo):
39     # userId: int=Field(default=1)
40     pass
41 
42 
43 users = {
44     "user01": {"username": "invoker", "email": "invoker2021@126.com"},
45     "user02": {"username": "pudge", "email": "pudge@126.com", "mobile": "15900000002", "address": "夜宴",
46                "full_name": "futu pudge"}
47 }
48 
49 
50 # response_model叫做路径操作(path operation)
51 # response_model_exclude_unset = False 表示返回值设置为空时,返回值会将默认值填充到返回值内。
52 @app041.post('/response_model_1', response_model=returnUserModel, response_model_exclude_unset=False)
53 async def response_model(user: inputUserModel):
54     print(user.password)
55     return users["user01"]
56 
57 
58 # response_model_exclude_unset = True 表示返回值如果为空,则返回空,不会将默认值填写返回。
59 @app041.post('/response_model_2', response_model=returnUserModel, response_model_exclude_unset=True)
60 async def response_model(user: inputUserModel):
61     print(user.password)
62     return users["user01"]
63 
64 
65 @app041.post(
66     '/response_model_3/attributes',
67     # 将请求模型和返回模型合并
68     response_model=Union[inputUserModel, returnUserModel],
69     response_model_exclude_unset=True
70 )
71 async def reponse_model_attributes(user: inputUserModel):
72     # 小技巧,删除掉password
73     del user.password
74     return user
View Code

from typing import Union

小技巧,去掉密码,使用del user.password

 

返回值:

{ "username": "invoker", "email": "user@example.com", "mobile": "15900000003", "address": "填在" }

 

6.模型技巧2 List+response_model_exclude,response_model_include

 1 '''
 2 @author:invoker
 3 @project:fastapi202108
 4 @file: chapter041.py
 5 @contact:invoker2021@126.com
 6 @descript:
 7 @Date:2021/8/5 21:22
 8 @version: Python 3.7.8
 9 '''
10 
11 from fastapi import APIRouter
12 from pydantic import BaseModel, EmailStr, Field
13 from typing import Optional, Union, List
14 
15 # 路由对象app04
16 app041 = APIRouter()
17 
18 """
19 响应模型
20 """
21 
22 
23 # 用户基本信息-基本模型体
24 class UserInfo(BaseModel):
25     username: str
26     email: EmailStr
27     mobile: str = "15900000003"
28     address: str = None
29     full_name: Optional[str] = None
30 
31 
32 # 输入用户信息-请求模型体
33 class inputUserModel(UserInfo):
34     password: str
35 
36 
37 # 返回用户信息,响应模型体
38 class returnUserModel(UserInfo):
39     # userId: int=Field(default=1)
40     pass
41 
42 
43 users = {
44     "user01": {"username": "invoker", "email": "invoker2021@126.com"},
45     "user02": {"username": "pudge", "email": "pudge@126.com", "mobile": "15900000002", "address": "夜宴",
46                "full_name": "futu pudge"}
47 }
48 
49 
50 # response_model叫做路径操作(path operation)
51 # response_model_exclude_unset = False 表示返回值设置为空时,返回值会将默认值填充到返回值内。
52 @app041.post('/response_model_1', response_model=returnUserModel, response_model_exclude_unset=False)
53 async def response_model(user: inputUserModel):
54     print(user.password)
55     return users["user01"]
56 
57 
58 # response_model_exclude_unset = True 表示返回值如果为空,则返回空,不会将默认值填写返回。
59 @app041.post('/response_model_2', response_model=returnUserModel, response_model_exclude_unset=True)
60 async def response_model(user: inputUserModel):
61     print(user.password)
62     return users["user01"]
63 
64 
65 @app041.post(
66     '/response_model_3/attributes',
67     # 将请求模型和返回模型合并
68     response_model=Union[inputUserModel, returnUserModel],
69     response_model_exclude_unset=True
70 )
71 async def reponse_model_attributes(user: inputUserModel):
72     # 小技巧,删除掉password
73     del user.password
74     return user
75 
76 
77 @app041.post(
78     '/response_model_4/List',
79     response_model=List[returnUserModel],
80     response_model_exclude_unset=True,
81     response_model_include=['username', 'email','password'],
82     response_model_exclude=['mobile', 'address']
83 
84 )
85 async def reponse_model_list(user: inputUserModel):
86     # 小技巧,删除掉password
87     del user.password
88     return [user, user]
View Code

 

接口4:/chapter041/response_model_4/List

6.1使用response_model=List[returnUserModel],定义返回的是以returnUserModel为模型的列表格式。

return [user,user]

6.2 使用response_model_include=['username','email','password'] 表示返回值必须要显示的字段。

      使用response_model_exclude=['mobile','address']标志返回值一定不显示的字段

6.3 del user.password的小技巧导致返回值不会显示password

综上所述,

请求报文:

{
"username": "invoker",
"email": "invoker2021@126.com",
"mobile": "15900000003",
"address": "天辉中路",
"full_name": "卡尔invoker",
"password": "123321"
}

返回报文:

[ { "username": "invoker", "email": "invoker2021@126.com" }, { "username": "invoker", "email": "invoker2021@126.com" } ]

 

 

posted @ 2021-08-06 16:42  kaer_invoker  阅读(123)  评论(0编辑  收藏  举报