FastAPI Web框架 [1.4]

学习,做个记录

请求体 - 多个参数

from fastapi import FastAPI,Path,Body
from typing import Optional
from pydantic import BaseModel

app=FastAPI()

#   混合使用 Path、Query 和请求体参数声明
class Item(BaseModel):
    name:str
    description:Optional[str] = None
    price:float
    tax:Optional[float]=None

@app.put("/items/{item_id}")
async def update_item(
        *,
        item_id:int=Path(...,title="The ID of the item to get",ge=0,le=1000),
        q:Optional[str] = None,
        item:Optional[Item] = None,         #   将从请求体获取的 item 是可选的。因为它的默认值为 None
):
    results =  {"item_id":item_id}
    if q:
        results.update({"q":q})
    if item:
        results.update({"item":item})
    return results

#   多个请求体参数
#   声明多个请求体参数,例如 item 和 user:
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

class User(BaseModel):
    username:str
    full_name:Optional[str] = None

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

# 请求体中的单一值
#  为了扩展先前的模型,你可能决定除了 item 和 user 之外,还想在同一请求体中具有另一个键 importance。
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

class User(BaseModel):
    username:str
    full_name:Optional[str] = None

@app.put("/items/{item_id}")
async def update_item(
        item_id:int,item:Item,user:User,importance:int = Body(...)
):
    results = {
        "item_id":item_id,
        "item":item,
        "user":user,
        "importance":importance
    }
    return results
#   FastAPI 将期望像这样的请求体:
#   {
#     "item": {
#         "name": "Foo",
#         "description": "The pretender",
#         "price": 42.0,
#         "tax": 3.2
#     },
#     "user": {
#         "username": "dave",
#         "full_name": "Dave Grohl"
#     },
#     "importance": 5
# }


#   多个请求体参数和查询参数
#   除了请求体参数外,你还可以在任何需要的时候声明额外的查询参数。
#   由于默认情况下单一值被解释为查询参数,因此你不必显式地添加 Query,你可以仅执行以下操作: q: str = None
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

class User(BaseModel):
    username:str
    full_name:Optional[str] = None

@app.put("/items/{item_id}")
async def update_item(
        *,
        item_id:int,
        item:Item,
        user:User,
        importance:int = Body(...,gt=0),
        q:Optional[str] = None          #可选的q
):
    results = {
        "item_id":item_id,
        "item":item,
        "user":user,
        "importance":importance
    }
    if q:
        results.update({"q":q})
    return results
#  Body 同样具有与 Query、Path 以及其他后面将看到的类完全相同的额外校验和元数据参数。



#   嵌入单个请求体参数
#   假设你只有一个来自 Pydantic 模型 Item 的请求体参数 item。
#   默认情况下,FastAPI 将直接期望这样的请求体。
#   但是,如果你希望它期望一个拥有 item 键并在值中包含模型内容的 JSON,就像在声明额外的请求体参数时所做的那样,则可以使用一个特殊的 Body 参数 embed:
#   item: Item = Body(..., embed=True)
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

@app.put("/items/{item_id}")
async def update_item(
        item_id:int,
        item:Item = Body(...,embed=True)
):
    results = {
        "item_id":item_id,
        "item":item
    }
    return results
#   在这种情况下,FastAPI 将期望像这样的请求体:
#   {
#     "item": {
#         "name": "Foo",
#         "description": "The pretender",
#         "price": 42.0,
#         "tax": 3.2
#     }
# }
#   ##而不是:!!!!
#   {
#     "name": "Foo",
#     "description": "The pretender",
#     "price": 42.0,
#     "tax": 3.2
# }

##      总结!
#   你可以添加多个请求体参数到路径操作函数中,即使一个请求只能有一个请求体。
# 但是 FastAPI 会处理它,在函数中为你提供正确的数据,并在路径操作中校验并记录正确的模式。
# 你还可以声明将作为请求体的一部分所接收的单一值。
# 你还可以指示 FastAPI 在仅声明了一个请求体参数的情况下,将原本的请求体嵌入到一个键中。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

carefree798

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值