from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.post("/items")
async def read_item(item: dict):
return {"item": item}
if __name__ == "__main__":
uvicorn.run(app="6_request:app", host="127.0.0.1", port=8080, reload=True, debug=True)
指定查询参数的类型为 dict
是 json 格式,符合预期
选了 text 之后,因为不是 JSON 字符串,FastAPI 无法正确解析请求体为 dict,所以会报类型错误的提示
类型是 text
Dict 是 typing 模块提供的类,可以指定键值对的数据类型
from typing import Dict
from fastapi import FastAPI
app = FastAPI()
@app.post("/Dict/")
# 键为 str,值为 float
async def create_index_weights(weights: Dict[str, float]):
return weights
声明为 Dict[str, float],FastAPI 会对每一个键值对都做数据校验,校验失败会有友好的错误提示
友好的错误提示啊~
from fastapi import FastAPI
from typing import Optional
from pydantic import BaseModel
app = FastAPI()
# 自定义一个 Pydantic 模型
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
@app.post("/items/")
# item 参数的类型指定为 Item 模型
async def create_item(item: Item):
return item
正常传参,所有属性按指定的类型进行传数据
name: str
description: str
price: float
tax: float
FastAPi 会将传进来的值自动转换为指定类型的值
如果转换失败,则会报 type_error 错误(如下图)
model 的 JSON Schema 会成为 Swagger APi 文档的一部分
因为知道 name 属性的类型是 str,所以 IDE 会智能提示 str 内置的方法
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.put("/items/{item_id}")
async def create_item(
# 路径参数
item_id: int,
# 请求体,模型类型
item: Item,
# 查询参数
name: Optional[str] = None):
result = {"item_id": item_id, **item.dict()}
print(result)
if name:
# 如果查询参数 name 不为空,则替换掉 item 参数里面的 name 属性值
result.update({"name": name})
return result
打印 result 的值
{'item_id': 1234, 'name': '小菠萝', 'description': '描述,非必填', 'price': 12.22, 'tax': 0.0}