[控制器]请求参数 练习
import re
from typing import Annotated, Any, List, Union
from fastapi import FastAPI, Form, Header, Query
from pydantic import BaseModel, EmailStr
app = FastAPI() # 这个实例将是创建你所有 API 的主要交互对象。这个 app 同样在如下命令中被 uvicorn 所引用
@app.get("/")
async def root():
return {"message": "Hello yuan"}
@app.post("/post")
async def rootPost():
return {"aaa":"1111"}
#传参 路径参数
@app.get("/getId/{id}")
async def get_Id(id:int):
return {"id":id}
# 传参 ?page=1&limit=10
@app.get("/list")
async def getList(page:int = 1,limit:int =10):
return {"page":page,"limit":limit}
#可选参数 ?itemId=2
@app.get("/items")
async def readItem(itemId:int ,q :str | None=None):
return {"itemId":itemId,"q":q}
# 用实体类来接收请求参数 像java一样
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
@app.post("/getObj")
async def getObj(item:Item):
return item
#在路径操作函数内部直接访问实体类对象的属性
@app.post("/items")
async def create_item(item: Item):
# 获取实体类里的数据
item_dict = item.dict()
if item.tax:
# 如果 tax 有值 和 price 相加
price_with_tax = item.price + item.tax
# 再追加一个key 返回
item_dict.update({"price_with_tax": price_with_tax})
return item_dict
# 将 Query 用作查询参数的默认值,并将它的 max_length 参数设置为 50:
# Union 组合 数据类型
@app.get("/getQuery")
async def read_items(q: Union[str, None] = Query(default=None, max_length=50)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
# 查询参数是一个 list ?q=foo&q=bar
@app.get("/getParmsList")
async def getParmsList(q: Union[List[str],None] = Query(default=None)):
return q
# 嵌套实体类 就是 主子表 注意 引入类 要放上面
class FormItem(BaseModel):
nameItem: str
class FormData(BaseModel):
name : str
item: FormItem|None=None
def __init__(self):
pass
# {
# "name": "json",
# "item":{
# "nameItem":"6666"
# }
# }
@app.put("/putForm")
async def update_item( formData: FormData):
results = {"formData": formData}
return results
# header 头
@app.get("/header")
async def header(user_agent: Annotated[str | None, Header()] = None):
return {"User-Agent": user_agent}
# 响应模型 也就是java的 返回类
@app.get("/getResponse",response_model=list[Item])
async def getR():
return [
{"name": "Portal Gun", "price": 42.0},
{"name": "Plumbus", "price": 32.0},
]
# 返回与输入
class UserIn(BaseModel):
username: str
password: str
email: EmailStr
full_name: Union[str, None] = None
class UserOut(BaseModel):
username: str
email: EmailStr
full_name: str | None = None
# 已经将 response_model 声明为了不包含密码的 UserOut 模型
@app.post("/user", response_model=UserOut)
async def create_user(user: UserIn) -> Any:
return user
#多个类
class UserIn(BaseModel):
username: str
password: str
email: EmailStr
full_name: str | None = None
class UserOut(BaseModel):
username: str
email: EmailStr
full_name: str | None = None
class UserInDB(BaseModel):
username: str
hashed_password: str
email: EmailStr
full_name: str | None = None
def fake_password_hasher(raw_password: str):
return "supersecret" + raw_password
#把字典 user_dict 以 **user_dict 形式传递给函数(或类),Python 会执行解包操作。它会把 user_dict 的键和值作为关键字参数直接传递。
def fake_save_user(user_in: UserIn):
hashed_password = fake_password_hasher(user_in.password)
user_in_db = UserInDB(**user_in.dict(), hashed_password=hashed_password)
print("User saved! ..not really")
return user_in_db
#接收的不是 JSON,而是表单字段时,要使用 Form。
@app.post("/login")
async def login(username: str = Form(), password: str = Form()):
return {"username": username}
if __name__ == '__main__':
import uvicorn
uvicorn.run("main:app", host="127.0.0.1", port=18080, reload=True)