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]的主要内容,如果未能解决你的问题,请参考以下文章