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 测试和开发

 

posted @ 2021-03-11 14:50  睡到自然醒ccc  阅读(1657)  评论(0编辑  收藏  举报