python:Fastapi - 响应模型和状态码

简单絮叨一下

前面聊CookieHeader一些事情,今天主要聊聊关于响应的一些事情

响应就是接口的返回值,及状态码等,这个是必须要有的。其返回的数据主要是用于前端调试页面和测试进行测试的参考。




响应模型

fastapi只需要在任意路径(@app.get()@app.post()@app.put()@app.delete())操作中使用response_model 参数来声明用于响应的模型。

注意点: response_model是「装饰器」方法(getpost 等)的一个参数。不像之前的所有参数和请求体,它不属于路径操作函数。

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_modelItem赋值,请求接口后返回与输入的数据相同

启动服务:

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_includeresponse_model_excluderesponse_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 及以上状态码用于「成功」响应。这些是你最常使用的。
  1. 200 是默认状态代码,它表示一切「正常」。
  2. 另一个例子会是 201,「已创建」。它通常在数据库中创建了一条新记录后使用。
  3. 一个特殊的例子是 204,「无内容」。此响应在没有内容返回给客户端时使用,因此该响应不能包含响应体。
  • 300 及以上状态码用于「重定向」。具有这些状态码的响应可能有或者可能没有响应体,但 304「未修改」是个例外,该响应不得含有响应体。
  • 400 及以上状态码用于「客户端错误」响应。这些可能是你第二常使用的类型。
  1. 一个例子是 404,用于「未找到」响应。
  2. 对于来自客户端的一般错误,你可以只使用 400。
  • 500 及以上状态码用于服务器端错误。你几乎永远不会直接使用它们。当你的应用程序代码或服务器中的某些部分出现问题时,它将自动返回这些状态代码之一。

今天先聊到这里吧,以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;非常期待你的一键 3 连【 点赞、收藏、分享 】哟,谢谢!

未完成,待续……

一直在努力,希望你也是!

微信搜索公众号:就用python

posted @ 2022-02-24 20:45  一名小测试  阅读(326)  评论(0编辑  收藏  举报