fastapi学习文档fastapi

fastapi教程翻译(四):Request Body(请求体)

2019-09-27  本文已影响0人  warmsirius

一、什么是请求体?

当您需要将数据从客户端(例如浏览器)发送到API时,可以将其作为 “请求体” 发送。

请求体是客户端发送到您的API的数据。 响应体是您的API发送给客户端的数据。

API几乎总是必须发送一个响应体,但是客户端并不需要一直发送请求体

定义请求体,需要使用 Pydantic 模型

  • 不能通过GET请求发送请求体
  • 发送请求体数据,必须使用以下几种方法之一:
    • POST (最常见),
    • PUT
    • DELETE
    • PATCH.

二、导入Pydantic'sBaseModel

定义模型

import BaseModel from pydantic

三、创建数据模型

所有的属性都用标准Python类

from pydantic import BaseModel

class Item(BaseModel):
    name: str 
    description: str = None
    price: float tax: float = None 

和Query参数一样:数据类型的属性如果不是必须的话,可以拥有一个默认值。否则,该属性就是必须的。

  • 可以使用None让这个属性变为可选的。

例如,上面的模型Item声明了一个JSON对象(或Pythondict),例如:

{
    "name": "Foo",
    "description": "An optional description",
    "price": 45.2,
    "tax": 3.5
}

...descriptiontax属性是可选的(因为有默认值None),所以下面这个JSON对象也是有效的:

{
    "name": "Foo",
    "price": 45.2
}

四、将模型定义为参数

将上面定义的模型添加到你的路径操作中,就和定义Path和Query参数一样的方式:

from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
    return item

...声明参数的类型为你创建的模型 Item.

五、使用 Request Body 的好处

通过那样定义Python 类型为pydanticmodelFastAPI 将会:

如果数据无效,它将返回一个清晰的错误,指出错误数据的确切位置和来源.

当您在函数中将其声明为Item类型时,您还将获得Item所有属性及其类型的所有编辑器支持(自动补全等)。
*为您的模型生成 JSON Schema 定义,如果对您的项目有意义,您还可以在其他任何喜欢的地方使用它们。

六、自动文档

模型的 JSON Schema 将成为OpenAPI生成模式的一部分,并将显示在交互式API文档中:

并且还将在需要它们的每个路径操作的API文档中使用:


七、编辑器支持

在你的编辑器中,编写的函数中,你将会获得类型提示和补全:

注意:如果你接收的是一个dict,而不是一个Pydantic model将不会获得提示和补全。

您也会获得类型操作错误检查:

这并非偶然,整个框架都是围绕该设计构建的。

并且在进行任何完善之前,都要在设计阶段进行全面测试,以确保它可以与所有编辑器一起使用。

Pydantic本身甚至进行了一些更改以支持此操作。

之前的屏幕截图是使用Visual Studio Code 拍摄的。

但是您可以通过PyCharm 和大多数其他Python编辑器获得相同的编辑器支持:

八、使用这个模型

在函数内部,您可以直接访问模型对象的所有属性:

from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
    item_dict = item.dict()
    if item.tax:
 price_with_tax = item.price + item.tax        item_dict.update({"price_with_tax": price_with_tax})
    return item_dict

九、Request body + path 参数

你可以同时定义Path参数请求体参数.

FastAPI 将:

  • 识别出与路径参数相匹配的功能参数应从路径中获取
  • 声明为Pydantic模型的功能参数应从请求主体中获取。
from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

app = FastAPI()

@app.put("/items/{item_id}") 
async def create_item(
    item_id: int,
    item: Item
):
    return {"item_id": item_id, **item.dict()}

十、Request body + path + query 参数

你可以同时定义Path参数Query参数请求体参数.

** FastAPI **将识别它们中的每一个并从正确的位置获取数据。

from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

app = FastAPI()

@app.put("/items/{item_id}")
async def create_item(
    item_id: int,
    item: Item,
    q: str = None
):
    result = {"item_id": item_id, **item.dict()}
    if q:
        result.update({"q": q})
    return result
FastAPI识别过程:
上一篇下一篇

猜你喜欢

热点阅读