python FastAPI 初接觸


先吹一波: 原來寫接口可以這么簡單!!! 簡單到沒朋友 。

中文官網: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 測試和開發

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM