zoukankan      html  css  js  c++  java
  • FastAPI 基础学习(六) Request Body(I)

    作者:麦克煎蛋   出处:https://www.cnblogs.com/mazhiyong/ 转载请保留这段声明,谢谢!

    Request Body是从客户端发送到API端的数据内容。

    一、单个Request Body

    通过以下几个简单环节我们就可以完成对Request Body的处理。

    1、导入Pydantic BaseModel

    from pydantic import BaseModel

    2、创建数据模型

    声明需要的数据模型,并且继承自BaseModel。

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

    模型属性均基于标准的Python类型。

    注意,与请求参数类似,如果模型属性有缺省值,那么就意味着它不是必须的,如果缺省值是None,则意味着是可选的;否则,它就是必须的。

    3、参数声明

    我们用声明路径参数和请求参数同样的方式来声明Request Body参数。

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

    通过以上的几个环节,FastAPI就实现了以下功能:

    (1)、从Request中解析出Body内容,并且输出格式为JSON。

    (2)、如果需要,进行相应的数据类型转换。

    (3)、校验数据,如果校验失败则返回详细错误信息。

    (4)、通过声明的参数对象来接收最终数据内容。

    4、使用数据模型

    你可以直接访问数据模型的所有属性。

    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

    实际运行示例如下:

    5、同时使用Request Body参数、路径参数、请求参数

    你可以同时声明Request Body参数、路径参数、请求参数这几种不同类型的参数。

    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

    函数参数按照如下的顺序进行识别匹配:

    (1)、如果这个参数已经在路径中被声明过,那么它就是一个路径参数。

    (2)、如果这个参数的类型是单类型的(如str、float、int、bool等),那么它就是一个请求参数。

    (3)、如果这个参数的类型是Pydantic数据模型,那么它就被认为是Request Body参数。

  • 相关阅读:
    POJ3094 UVALive3594 HDU2734 ZOJ2812 Quicksum【进制】
    UVALive5583 UVA562 Dividing coins
    POJ1979 HDU1312 Red and Black【DFS】
    POJ1979 HDU1312 Red and Black【DFS】
    POJ2386 Lake Counting【DFS】
    POJ2386 Lake Counting【DFS】
    HDU4394 Digital Square
    HDU4394 Digital Square
    UVA213 UVALive5152 Message Decoding
    UVA213 UVALive5152 Message Decoding
  • 原文地址:https://www.cnblogs.com/mazhiyong/p/12902149.html
Copyright © 2011-2022 走看看