zoukankan      html  css  js  c++  java
  • 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_profilepy"
        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_profilepy"
        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 测试和开发

  • 相关阅读:
    SystemParametersInfo调用失败的问题
    在wince下如何禁止移动窗体
    【转】WinCE控制面板添加应用程序
    CE6.0 下获得 SD 卡序列号的方法
    SetSystemMemoryDivision 的用法
    两经纬度之间的距离计算
    PC 上访问设备数据库的方法
    通过程序模拟鼠标按下
    车牌号
    比较字母大小
  • 原文地址:https://www.cnblogs.com/yc-c/p/14517909.html
Copyright © 2011-2022 走看看