首页 > 编程语言 > 详细

python FastAPI 初接触

时间:2021-03-11 17:43:17      阅读:31      评论:0      收藏:0      [点我收藏+]

先吹一波: 原来写接口可以这么简单!!! 简单到没朋友 。

中文官网: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}


 

 

安排。。。

以后项目又多了一个选择。

 附上API文档:

技术分享图片

 

 

 

特别鸣谢:Python 测试和开发

 

python FastAPI 初接触

原文:https://www.cnblogs.com/yc-c/p/14517909.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!