先吹一波: 原來寫接口可以這么簡單!!! 簡單到沒朋友 。
中文官網:https://fastapi.tiangolo.com/zh/tutorial/header-params/
且天然支持異步處理。
自動生成API文檔,
還說比肩NodeJs和Go 、這個我就沒有具體測試了,有興趣的可以自行嘗試比較
當然了、一個完整的項目肯定不只是下面的這些示例、包含日志文件處理、數據庫操作、返回值封裝、公共參數、異常處理 等等。
直接上代碼吧,一切的解釋都是多余的。
Hello World !!
from fastapi import FastAPI,Form,Query,UploadFile,File,Request from pydantic import BaseModel,Field from typing import Optional,List import os,sys ''' 虛擬環境切換: conda activate FastAPI FastAPI 程序啟動 :uvicorn manger:app --port 7777 --reload ''' app = FastAPI() @app.get('/') async def root(): # get 請求 return {'message':'Hello World!'}
動態路徑:
@app.get('/{test_id}') async def api_get_text(test_id:int): # get 請求 動態路徑 return {'data':test_id}
post:
@app.post('/user') async def api_post_text(data:dict): #Post 請求,json格式 return {'data':data}
請求內容檢測:
class detection(BaseModel): name:str age:int = 18 #默認值 sex:Optional[str] # null 類型 @app.post('/PostDetection') async def api_post_text(data:detection): #Post 請求內容檢測 return {'data':data}
請求內容多個主體檢測:
class Mds(BaseModel): name: str age: int = 18 home: str height: Optional[str] class Mm(BaseModel): title: str phone: str = 'huawei' @app.put("/PutTest/") async def PutTests(Mds:Mds,Mm:Mm,name:str,q: Optional[bool] = False): ret = {} if q: ret.update({"request_name":name}) if Mds.name: ret.update({"Name":Mds.name}) if Mds.height: ret.update({"height":Mds.height}) if Mm.title: ret.update({"Title":Mm.title}) return ret
From表單:
@app.post('/userFrom/') async def api_post_text(username: str = Form(...),password:str = Form(...)): # Post 請求 ,From 表單格式 return {'username':username,"Password":password}
API內容代碼直接體現:
class Posttest(BaseModel): test_name:str max_data:int = 10 class Config: # 手動定義接口返回值 示例內容 schema_extra = { "example":{ "name":"YCC", "data":{ "age":12, 'sex':'boy' } } } @app.post("/postTest/") async def test_posts(data:Posttest,name:str = Query(...,title="post test",example='phyger',max_length=5,alias='x-name',deprecated=True,description="test_description")): ''' 這部分可直接在 接口文檔內展示 Query 字段查詢檢驗 title 接口文檔字段注釋 min_length 最短 max_length 最長 alias 變量別名 用於接收不合法參數名稱 (接口請求時傳遞x-name ,接收到時會將x-name 匹配為name,設定后 只會匹配x-name 不匹配name) description 字段描述信息 example 示例參數 deprecated 接口廢棄提示 ''' return {"name":name,"data":data}
多層嵌套檢測:
class TowOptionalData(BaseModel): townumber:int class OptionalData(BaseModel): name:str = Field(...,example='ccc') # 檢測字段內自定義限制 userlist:List[str] # 列表內容類型限制 data:Optional[TowOptionalData] @app.post('/OptionalTset/') async def test_Optional(data:OptionalData): ''' 多層嵌套類型檢測 ''' return {'masage':"多層嵌套!!","data":data}
單個文件上傳:
@app.post('/File/') async def File_upload(request:Request,files:UploadFile =File(...)): ''' 文件對象默認是個列表 files.filename 獲取文件名稱 files.content_type 獲取文件類型 ''' path = R"F:\my_pro\file\py" newfile = files newpath = os.path.join(path,newfile.filename) try: res = await newfile.read() # print(len(res)/1024) with open(newpath, "wb") as f: f.write(res) rts = { "filename":file.filename, "filetype":file.content_type, "size":"%.2f KB"%(len(res)/1024) } return {'code':0,'data':rts} except Exception as e : msg = e return {"err_msg":e}
多文件上傳:
@app.post('/FileList/') async def File_upload(request:Request,filelist:List[UploadFile] =File(...)): #多文件上傳 ''' 文件對象默認是個列表 files.filename 獲取文件名稱 files.content_type 獲取文件類型 ''' path = R"F:\my_pro\file\py" oklist = [] errlist = [] for file in filelist: try: newpath = os.path.join(path,file.filename) res = await file.read() with open(newpath, "wb") as f: f.write(res) rts = { "filename":file.filename, "FileType":file.content_type, "size":"%.2f KB"%(len(res)/1024) } oklist.append(rts) except Exception as e: errlist.append({'name':file.filename,'msg':e}) return {"code":200,"oklist":oklist,"errlist":errlist}
請求頭獲取:
@app.get('/') async def root(user_agent: Optional[str] = Header(None),test:Optional[str] = Header(None)): # get 請求 return {'message':'Hello World!','data':test}
返回值封裝:
安排。。。
以后項目又多了一個選擇。
附上API文檔:
特別鳴謝:Python 測試和開發