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

浙公网安备 33010602011771号