FastAPI框架练习一(python)

81 阅读2分钟

[控制器]请求参数 练习


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)