当前位置: 首页 > news >正文

fastApi笔记06-请求体-多个参数

多个请求体参数

from fastapi import FastAPI, Path, Query
from pydantic import BaseModel

app = FastAPI()


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


class User(BaseModel):
    username: str
    full_name: str | None = None


@app.put("/items")
async def update_item(item: Item, user: User):
    results = {"item": item, "user": user}
    return results

 当函数有多个请求实体(多个 Pydantic 模型参数),将使用参数名称作为请求体中的键(字段名称),并期望一个类似于以下内容的请求体

{
    "item": {
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2
    },
    "user": {
        "username": "dave",
        "full_name": "Dave Grohl"
    }
}

请求体中的单一值

 假如为了拓展先前的模型,除了user和item之外,在请求体中增加一个字段importance,需要使用Body来声明,不然会被当做查询参数

from fastapi import FastAPI, Body
from pydantic import BaseModel

app = FastAPI()


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


class User(BaseModel):
    username: str
    full_name: str | None = None


@app.put("/items")
async def update_item(item: Item, user: User, importance: int = Body()):
    results = {"item": item, "user": user, "importance": importance}
    return results
{
    "item": {
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2
    },
    "user": {
        "username": "dave",
        "full_name": "Dave Grohl"
    },
    "importance": 5
}

嵌入单个请求体实参

 假如只有一个来自的模型Item,如果你希望它期望一个拥有 item 键并在值中包含模型内容的 JSON,就像在声明额外的请求体参数时所做的那样。比如下面这样的。

{
    "item": {
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2
    }
}

而不是这样的。

{
    "name": "Foo",
    "description": "The pretender",
    "price": 42.0,
    "tax": 3.2
}

则可以使用一个特殊的 Body 参数 embed

from typing import Annotated

from fastapi import Body, FastAPI
from pydantic import BaseModel

app = FastAPI()


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


@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Annotated[Item, Body(embed=True)]):
    results = {"item_id": item_id, "item": item}
    return results

 声明模型属性

和使用Query,Path,Body在路径操作函数中声明参数校验和元数据的方式相同,可以使Pydantic 的Field在模型内部进行声明校验和元数据

from typing import Annotated

from fastapi import Body, FastAPI
from pydantic import BaseModel, Field

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = Field(
        default=None, title="The description of the item", max_length=300
    )
    price: float = Field(gt=0, description="The price must be greater than zero")
    tax: float | None = None


@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Annotated[Item, Body(embed=True)]):
    results = {"item_id": item_id, "item": item}
    return results

相关文章:

  • 外包干了一个月,技术明显进步。。。。。
  • Rabbitmq入门与应用(三)-RabbitMQ开发流程
  • objectMapper、ObjectNode、JsonNode调用接口时进行参数组装
  • Redis篇----第六篇
  • Spring 类型转换、数值绑定与验证(一)— DataBinder
  • 向量数据库Milvus字符串查询
  • 《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_4
  • leetcode hot100单词拆分
  • 物联网和人工智能的融合
  • MFC中对编码文件的操作01
  • 图片搜索接口的应用展示说明
  • 阿里云ECS香港服务器性能强大、cn2高速网络租用价格表
  • Python学习笔记——自定义函数(基础知识)
  • qt-交通路口仿真
  • 数学的雨伞下:理解世界的乐趣
  • openEuler2203 LTS安装并远程桌面接VMware WorkStation Pro 17
  • 找座位 - 华为OD统一考试(C卷)
  • 虽迟但到,Postman终于支持Websocket接口了
  • 备战蓝桥杯 Day8(最长上升子序列LIS模型)
  • 第六章:纹理贴图
  • 招行一季度净利372.86亿降2.08%,营收降逾3%
  • 五万吨级半潜船在沪完成装备装载
  • 李祥翔评《孔子哲学思微》︱理性秩序与美学秩序的碰撞
  • 促进产销对接,安徽六安特色产品将来沪推介
  • 酒店就“保洁员调包住客港币”致歉,称希望尽早达成解决方案
  • 中日友好医院通报“医师肖某被举报”:基本属实,开除党籍并解聘