FastAPI Web框架 [1.4]

Posted Ch4536251

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 在仅声明了一个请求体参数的情况下,将原本的请求体嵌入到一个键中。

以上是关于FastAPI Web框架 [1.4]的主要内容,如果未能解决你的问题,请参考以下文章

三分钟了解 Python3 的异步 Web 框架 FastAPI

FastAPI Web框架 [1.1]

FastAPI Web框架 [依赖项]

FastAPI Web框架 [依赖项]

FastAPI Web框架 [1.10]

FastAPI Web框架 [1.9]