python:Fastapi - 响应模型和状态码
简单絮叨一下
前面聊Cookie
和Header
一些事情,今天主要聊聊关于响应的一些事情
响应就是接口的返回值,及状态码等,这个是必须要有的。其返回的数据主要是用于前端调试页面和测试进行测试的参考。
响应模型
fastapi
只需要在任意路径(@app.get()
、@app.post()
、@app.put()
、@app.delete()
)操作中使用response_model
参数来声明用于响应的模型。
注意点:
response_model
是「装饰器」方法(get
,post
等)的一个参数。不像之前的所有参数和请求体,它不属于路径操作函数。
from typing import List, Optional
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
tagg: List[str] = []
@app.post("/items/", response_model=Item)
async def create_item(item: Item):
return item
response_model
就是定义返回值,因为response_model
被Item
赋值,请求接口后返回与输入的数据相同
启动服务:
PS E:\git_code\python-code\fastapiProject> uvicorn response_main:app --reload
请求接口:
POST http://127.0.0.1:8000/items
请求参数:
{
"name": "张三",
"price": 3.2
}
请求结果:
{
"name": "张三",
"description": null,
"price": 3.2,
"tax": null,
"tagg": []
}
如果我们输入的是含密码的,那上述那种返回与输入相同的数据就不适合该需求了,那这样就得定义输出的模型:
from typing import List, Optional
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
from fastapi import status
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
注释信息:
EmailStr
是邮件类型。UserIn
是输入模型,而UserOut
是输出模型。response_model=UserOut
是接收的输出模型。user: UserIn
是接收的输入模型。return user
虽说是返回输入模型,但是我们已经声明了输出模型,因此,FastAPI
将会负责过滤掉未在输出模型中声明的所有数据。
启动服务:
PS E:\git_code\python-code\fastapiProject> uvicorn response_main:app --reload
请求接口:
POST http://127.0.0.1:8000/user
请求参数:
{
"username": "lifeng",
"password":"123456",
"email": "123@qq.com",
"full_name": "debuglifeng"
}
请求结果:
{
"username": "lifeng",
"email": "123@qq.com",
"full_name": "debuglifeng"
}
实际工作中,有些时候只需要返回设定的参数或者是要指定输出结果,response_model_exclude_unset
参数就是仅返回显式设定的值,而定义一个ID
来处理指定返回值。
response_model_exclude_unset传True
from typing import List, Optional
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
from fastapi import status
app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
tagg: List[str] = []
@app.post("/items/", response_model=Item, response_model_exclude_unset=True)
async def create_item(item: Item):
return item
response_model_exclude_unset=True
是仅返回显式设定的值,意思就是你请求传几个参数就返回几个参数。
启动服务:
PS E:\git_code\python-code\fastapiProject> uvicorn response_main:app --reload
请求接口:
POST http://127.0.0.1:8000/items
请求参数:
{
"name": "张三",
"price": 3.2
}
请求结果:
{
"name": "张三",
"price": 3.2
}
指定返回值
就是向路径操作发送指定的 ID
,这类数据可在数据库中获取:
from typing import List, Optional
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Default(BaseModel):
name: str
description: str = None
price: float
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.post(
"/default/{item_id}", response_model=Default)
async def default_items(item_id: str):
return items[item_id]
items
这个大字典,后续可在数据库中获取数据
启动服务:
PS E:\git_code\python-code\fastapiProject> uvicorn response_main:app --reload
请求接口:
POST http://127.0.0.1:8000/default/bar
请求参数:
{
"name": "zhangsan",
"price": 10.22
}
请求结果:
{
"name": "Bar",
"description": "The bartenders",
"price": 62.0,
"tax": 20.2,
"tags": []
}
再来聊聊response_model_include
和 response_model_exclude
,response_model_include
是返回值包括哪些参数,而response_model_exclude
是返回值不包括哪些参数:
response_model_include
传参
from typing import List, Optional
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = 3.33
tagg: List[str] = []
@app.post("/items/", response_model=Item, response_model_include={"name"})
async def create_item(item: Item):
return item
请求参数:
{
"name": "张三",
"price": 3.2
}
请求结果:
{
"name": "张三"
}
response_model_exclude
传参
from typing import List, Optional
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = 3.33
tagg: List[str] = []
@app.post("/items/", response_model=Item, response_model_exclude={"price"})
async def create_item(item: Item):
return item
请求参数:
{
"name": "张三",
"price": 3.2
}
请求结果:
{
"name": "张三",
"description": null,
"tax": 3.33,
"tagg": []
}
响应状态码
fastapi
只需要在任意路径(@app.get()
、@app.post()
、@app.put()
、@app.delete()
)操作中使用status_code
参数来声明用于响应的 HTTP
状态码。
直接传状态码
from fastapi import FastAPI
app = FastAPI()
@app.post("/items/", status_code=201)
async def items(name: str):
return {"name": name}
status_code
参数接收一个表示 HTTP
状态码的数字。
引入status状态包
from fastapi import FastAPI, status
app = FastAPI()
@app.post("/items/", status_code=status.HTTP_201_CREATED)
async def items(name: str):
return {"name": name}
HTTP状态码解释:
- 100 及以上状态码用于「消息」响应。你很少直接使用它们。具有这些状态代码的响应不能带有响应体。
- 200 及以上状态码用于「成功」响应。这些是你最常使用的。
- 200 是默认状态代码,它表示一切「正常」。
- 另一个例子会是 201,「已创建」。它通常在数据库中创建了一条新记录后使用。
- 一个特殊的例子是 204,「无内容」。此响应在没有内容返回给客户端时使用,因此该响应不能包含响应体。
- 300 及以上状态码用于「重定向」。具有这些状态码的响应可能有或者可能没有响应体,但 304「未修改」是个例外,该响应不得含有响应体。
- 400 及以上状态码用于「客户端错误」响应。这些可能是你第二常使用的类型。
- 一个例子是 404,用于「未找到」响应。
- 对于来自客户端的一般错误,你可以只使用 400。
- 500 及以上状态码用于服务器端错误。你几乎永远不会直接使用它们。当你的应用程序代码或服务器中的某些部分出现问题时,它将自动返回这些状态代码之一。
今天先聊到这里吧,以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;非常期待你的一键 3 连【 点赞、收藏、分享 】
哟,谢谢!
未完成,待续……
一直在努力,希望你也是!
微信搜索公众号:就用python